문제

MS SQL Server,내가 만들어 내는 스크립트를 사용하여 사용자 정의 변수:

DECLARE @somevariable int  
SELECT @somevariable = -1

INSERT INTO foo VALUES ( @somevariable )

나는 그 변경의 가치 @somevariable at runtime,값에 따라 내가 원하는 특정 상황이다.기 때문에서 최고의 스크립트는 그것을 쉽게 확인하고 기억합니다.

나는 어떻게 이와 같은 클라이언트 프로그램 psql?

도움이 되었습니까?

해결책

레스 변수를 통해 생성\명령 세트,예를 들어...

\set myvariable value

...과될 수 있습 대체로서,예를 들어,...

SELECT * FROM :myvariable.table1;

...나...

SELECT * FROM table1 WHERE :myvariable IS NULL;

편집:로십시오.9.1,변수를 확장할 수 있습에 따옴표로서:

\set myvariable value 

SELECT * FROM table1 WHERE column1 = :'myvariable';

의 이전 버전의하십시오.클라이언트:

...는 경우 사용할 변수 값으로 조건부 문자열을 쿼리와 같은...

SELECT * FROM table1 WHERE column1 = ':myvariable';

...다음을 포함해야 합 따옴표로서 변수로 위에 작동하지 않습니다.대신 정의하는 변수는 이와 같이...

\set myvariable 'value'

그러나 나처럼,당신으로 달려있는 상황을 만들고 싶었 문자열에서 기존의 변수가 기술을 이...

\set quoted_myvariable '\'' :myvariable '\''

이제 당신은 모두를 인용하고 따옴표가 없는 변수의 동일한 문자열!당신은 다음과 같이 할 수 있다....

INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;

다른 팁

하나의 마지막 말에 대해서 변수:

  1. 그들이 확장하지 않는 경우로 묶는 작은 따옴표에서 SQL 문입니다.따라서 이것은 작동하지 않는:

    SELECT * FROM foo WHERE bar = ':myvariable'
    
  2. 을 확장하는 문자열 리터럴에서 SQL 문을 포함하는 따옴표로서 변수 설정합니다.그러나,이 변수의 값이 이미 있는 것을 따옴표로 묶을 의미하는,필요하신 두 번째 설정의 인용,그리고 내부 설정을 탈출했다.따라서 당신은 필요합니다:

    \set myvariable '\'somestring\''  
    SELECT * FROM foo WHERE bar = :myvariable
    

    편집:을 시작으로 PostgreSQL9.1 할 수 있습 쓰는 대신:

    \set myvariable somestring
    SELECT * FROM foo WHERE bar = :'myvariable'
    

을 시도할 수 있습 사용 절입니다.

WITH vars AS (SELECT 42 AS answer, 3.14 AS appr_pi)
SELECT t.*, vars.answer, t.radius*vars.appr_pi
FROM table AS t, vars;

를 위해 특별히 psql, 전달할 수 있습니다 psql 변수 명령행에서도;당신이 그들을 통과 할 수 있으로 -v.여기에 사용 예제:

$ psql -v filepath=/path/to/my/directory/mydatafile.data regress
regress=> SELECT :'filepath';
               ?column?                
---------------------------------------
 /path/to/my/directory/mydatafile.data
(1 row)

참고는 콜론을 따옴표로 묶지 않고,다음 변수 이름 자체는 따옴표로 묶어서는 안 됩니다.이상한 구문을 내가 알고있다.이에서 작동하십시오.;그것은 작동하지 않습니에(말)PgAdmin-III.

이를 대체하는 동안 발생 입력에서 처리해서는,그래서 당신은 수 없다(예)정의하는 기능을 사용하는 :'filepath' 과 기대의 값 :'filepath' 을 변경하에서 세션.그것을 대체할 때 한번 함수가 정의되며,다음을 것입니다.그것은 스크립팅하는데 있어서 유용하지만 runtime 사용.

FWIW,진짜 문제는 포함되는 세미콜론의 끝에서 내\설정 명령:

\설정 owner_password'암호를';

세미콜론으로 해석했는 실제 문자에서 변:

\echo:owner_password 암호를;

그래서려고 할 때 그것을 사용:

CREATE 역할 myrole 로그인 비밀번호는 암호화되지 않은:owner_password NOINHERIT CREATEDB CREATEROLE 때까지 유효'infinity';

...내가 이것을 가지고:

CREATE 역할 myrole 로그인이 암호화되지 않은 암호를 암호를;NOINHERIT CREATEDB CREATEROLE 때까지 유효'infinity';

그 뿐만 아니라 실패를 설정하는 따옴표 문자,그러나 분할할 명령으로 2 부(의 두 번째는 잘못되었으로 시작으로"NOINHERIT").

의 도덕적 이 이야기:PostgreSQL"변수는"정말 매크로에서 사용되는 텍스트를 확장,지 않은 진정한 값입니다.나는 확실히 유용하지만,그것은 까다로운습니다.

중 하나를 사용할 필요가 절차와 같은 언어 PL/pgSQL SQL proc 언어입니다.PL/pgSQL 사용할 수 있는 변수는 오른쪽에서 SQL 문을 수행합니다.에 대한 따옴표를 사용할 수 있습니다 견적 리터럴 기능입니다.

레스(버전부터 9.0)할 수 있습 익명의 블록에서 지원되는 서버 스크립트 언어

DO '
DECLARE somevariable int = -1;
BEGIN
INSERT INTO foo VALUES ( somevariable );
END
' ;

http://www.postgresql.org/docs/current/static/sql-do.html

으로 모든 것은 내부 문자열,외부 문자열 변수는 대체에서 탈출해야하고 인용했다.를 사용하여 달러에 인용하는 대신에 제공하지 않습니다 가득 차있는 보호에 대한 SQL injection.

다른 방법은(ab)사용 PostgreSQL GUC 메커니즘을 만들 변수입니다.보 이전에 응답 자세한 내용 및 예입니다.

당신이 선언하는 GUC 에 postgresql.conf, 다음 값을 변경 런타임에 SET 명령어와 해당 값을 가져오와 current_setting(...).

내가 추천하지 않는 이에 대한 일반적인 사용이지만,그것을하는 데에 도움이 될 수 있습니다 좁은 같은 경우 중 하나에서 언급된 질문에는 원하는 포스터를 제공하는 방법 응용 프로그램을 수준의 사용자 이름을 트리거와 기능이 있습니다.

나는 그것을 해결으로 임시이다.

CREATE TEMP TABLE temp_session_variables (
    "sessionSalt" TEXT
);
INSERT INTO temp_session_variables ("sessionSalt") VALUES (current_timestamp || RANDOM()::TEXT);

이 방법을 했다"변수"아니면 사용할 수 있습을 통해 여러 쿼리,독특한 세션이 있습니다.나는 그것을 필요로했을 생성하는 독특한"사용자"하는 동안 여전히 있지 않는 충돌 가져오는 경우 동일한 사용자는 사용자 이름입니다.

이 질문 답변은 매우 유용하지만,또한 혼란스럽습니다.나의 많은 문제가 점점 인용 변수 작업,그래서 여기 방법입니다 나는 그것을 가지고 작업:

\set deployment_user username    -- username
\set deployment_pass '\'string_password\''
ALTER USER :deployment_user WITH PASSWORD :deployment_pass;

이 방법을 정의할 수 있는 변수 하나의 문입니다.당신이 그것을 사용하는 경우,작은 따옴표를 포함됩 변수입니다.

주의!때 난 후 코멘트를 넣어는 인용 변수는 그것을 가지고 빨아에서의 일환으로 변수가 몇 가지 방법들을 통해서 다른 답변이 있습니다.는 정말 조을 더욱 쉽게 확인할 수 있게 되었다.이 방법으로 의견이 나타납으로 처리하여야 간편하게 사용할 수 있습니다.

정말 그리워하는 기능입니다.만을 달성하는 방법을 비슷한 기능을 사용하기 위해.

나는 그것을 사용하고 있는 두 가지 방법:

  • perl 기능을 사용하는$_SHARED 변수
  • 저장할 변수 테이블

Perl 버전:

   CREATE FUNCTION var(name text, val text) RETURNS void AS $$
        $_SHARED{$_[0]} = $_[1];
   $$ LANGUAGE plperl;
   CREATE FUNCTION var(name text) RETURNS text AS $$
        return $_SHARED{$_[0]};
   $$ LANGUAGE plperl;

테이블 버전:

CREATE TABLE var (
  sess bigint NOT NULL,
  key varchar NOT NULL,
  val varchar,
  CONSTRAINT var_pkey PRIMARY KEY (sess, key)
);
CREATE FUNCTION var(key varchar, val anyelement) RETURNS void AS $$
  DELETE FROM var WHERE sess = pg_backend_pid() AND key = $1;
  INSERT INTO var (sess, key, val) VALUES (sessid(), $1, $2::varchar);
$$ LANGUAGE 'sql';

CREATE FUNCTION var(varname varchar) RETURNS varchar AS $$
  SELECT val FROM var WHERE sess = pg_backend_pid() AND key = $1;
$$ LANGUAGE 'sql';

Notes:

  • 되고 많으며 업데이트된 버전이 들 것보다 더 빨리 perl
  • pg_backend_pid 지 않은 최고의 식별 세션을 사용하여 pid 와 결합 backend_start 에서 pg_stat_activity
  • 이 테이블 버전은 나쁜여야하기 때문에 명확한 이는 때때로(을 삭제하지 않고 현재 세션 변수)

변수 psql suck.하고 싶은 경우 선언의 정수를 입력 해야 합니다 정수,그때 캐리지 리턴,다음 끝에서 문을 경우 세미콜론으로 구분합니다.관찰:

Let's 말하고 싶어 정수 변수를 선언 my_var 에 삽입하는 테이블 test:

예 테이블 test:

thedatabase=# \d test;
                         Table "public.test"
 Column |  Type   |                     Modifiers                     
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('test_id_seq'::regclass)
Indexes:
    "test_pkey" PRIMARY KEY, btree (id)

게 아무것도에서는 아직 테이블:

thedatabase=# select * from test;
 id 
----
(0 rows)

우리가 선언하는 변수입니다. 방법을 알 수 있는 세미콜론은 다음 줄에!

thedatabase=# \set my_var 999
thedatabase=# ;

이제 우리는 삽입 할 수 있습니다.우리가 사용하는 이상":''"보 syntax:

thedatabase=# insert into test(id) values (:'my_var');
INSERT 0 1

일했다!

thedatabase=# select * from test;
 id  
-----
 999
(1 row)

설명:

그래서...무슨 일이 없는 경우 세미콜론에 다음 줄?변?보라:

우리는 선언 my_var 지 않고 새로운 라인입니다.

thedatabase=# \set my_var 999;

자의 선택 my_var.

thedatabase=# select :'my_var';
 ?column? 
----------
 999;
(1 row)

터입니까?아 정수, 그 문자열 999;!

thedatabase=# select 999;
 ?column? 
----------
      999
(1 row)

나는 새로운 해결책에 대한 이 다른 스레드에서.

그것은 테이블을 사용하여 저장할 변수 및 업데이트할 수 있습니다.정적 불변의 게터 기능을 동적으로 만들어진(다른 기능)트리거해 업데이트하고 있습니다.당신은 좋은 테이블 스토리지 플러스,타오르는 빠른 속도를 변경할 수 없는 getter.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top