2013-09-07 2 views
3
여기

내 psql의 스크립트가 작동하지 않습니다되는 :psql의 스크립트에서 변수를 사용하는 방법을

\set path '''c:\\server\\data\\'''; 
COPY paymentMethods (name,regexString) FROM :path+'paymentMethods.csv' WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM :path+'priceLevels.csv' WITH (FORMAT csv, HEADER false); 

psql 프로그램은 +

에서 구문 오류에 대해 불평 내가 있도록 변경할 수 있습니다 어떻게 작품은 한 번 언급 된 실제 경로 문자열을 가지고있는 동안 작동합니까?

답변

6

먼저 배치 할 수 있지만, 연결에 대한 SQL 연산자가 정보와 함께 ||, 당신은 예상 된 결과를 생각할 수 ( 작동하지 않습니다 )를 다음과 같습니다

\set path '''c:\\server\\data\\''' 
COPY paymentMethods (name,regexString) FROM :path || 'paymentMethods.csv' WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM :path || 'priceLevels.csv' WITH (FORMAT csv, HEADER false); 

하지만를! COPY 명령은 표현식이 아닌 경로에 대한 리터럴 문자열을 예상하므로 실제로 경로를 지정해야합니다. 이 정보로 등 SELECT, INSERT, UPDATE,

같은 명령을 위해 일 것입니다주의 만 파벨가 지적했듯이, psql 변수를 사용하고, psql의 변수에 문자열을 연결할 수 있습니다. (PostgreSQL의의 서버로 보내드립니다)

\set path 'c:\\server\\data\\' 
\set paymentMethodsPath :path 'paymentMethods.csv' 
\set priceLevelsPath :path 'priceLevels.csv' 
COPY paymentMethods (name,regexString) FROM :'paymentMethodsPath' WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM :'priceLevels' WITH (FORMAT csv, HEADER false); 

생성합니다 : 좋은 해결책, 즉 SQL 식에 문자열로 변수를 삽입 psql:'var' 구문을 사용하는 것입니다

COPY paymentMethods (name,regexString) FROM E'c:\\server\\data\\paymentMethods.csv' WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM E'c:\\server\\data\\priceLevels.csv' WITH (FORMAT csv, HEADER false); 

:'var' 구문은 (지금이 도입 된 하나 기억하지 않습니다) 모든 psql 버전에서 작동하지 않습니다,하지만 이전 버전에 대한 당신은 쉽게 달러 인용 사용할 수 있습니다

\set path 'c:\\server\\data\\' 
\set paymentMethodsPath :path 'paymentMethods.csv' 
\set priceLevelsPath :path 'priceLevels.csv' 
COPY paymentMethods (name,regexString) FROM $$:paymentMethodsPath$$ WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM $$:priceLevels$$ WITH (FORMAT csv, HEADER false); 

또는 작은 따옴표로 탈출 : 그것은

\set path 'c:\\server\\data\\' 
\set paymentMethodsPath 'E''':path'paymentMethods.csv''' 
\set priceLevelsPath 'E''':path'priceLevels.csv''' 
COPY paymentMethods (name,regexString) FROM :paymentMethodsPath WITH (FORMAT csv, HEADER true); 
COPY priceLevels (name) FROM :priceLevels WITH (FORMAT csv, HEADER false); 

즉.

2

psql에는 연산자가 없습니다. 당신은, 당신이 + 연산자로 두 문자열을 연결하려고하는 (곳) 변수 모든

 
postgres=# \set var1 AAAA 
postgres=# \set var2 BBBB 
postgres=# \echo :var1:var2 
AAAABBBB 
postgres=# \echo :var1 :var2 
AAAA BBBB 
postgres-# \echo :var1'\\':var2 
AAAA\BBBB 

postgres=# \set mypath '/tmp' 
postgres=# \set mypathx :mypath/x.csv 
postgres=# \echo :mypathx 
/tmp/x.csv 
postgres=# copy fo from :'mypathx'; 
COPY 1 
postgres=# \set mypathy :mypath/y.csv 
postgres=# copy fo from :'mypathy'; 
COPY 1 
+0

그래서, 당신의 대답은 내가 원한 것은 psql 스크립트에서 불가능하다는 것입니다. – mark

+0

업데이트가 가능한 답변을 참조하십시오 –

관련 문제