2017-06-08 4 views
0

私は複数のデータベースに対して実行する予定のPostgresスクリプトを持っています。サンプルSQLは変数のみ適切にテーブル定義に代入していない取得しないのはなぜ私が
psql -d db -p 5432 -U username -h localhost -f test.sql --variable=CRS=3857関数を使ったpostgresスクリプトのpsql変数の置換

としてランタイム上でそれを置き換えることができるように、私は内部の変数を入れている

CREATE FUNCTION point() RETURNS trigger 
LANGUAGE plpgsql 
AS $$ 
BEGIN 
NEW.the_geom:=ST_SetSRID(geom, :CRS) ; 
RETURN NEW; 
END 
$$; 

CREATE TABLE admin (
gid integer NOT NULL, 
geom geometry(Polygon,:CRS)  
); 

のような関数やテーブルを持っていますしたがって、関数定義

+0

のbashとして呼び出せるファイルは、plpgsqlに ':'演算子とsqlが含まれていない可能性がありますか? –

答えて

0

https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-INTERPOLATION

、建設S ':foo'は変数の値から 引用符付きリテラルを生成するようには機能しません( が動作した場合、 の値に埋め込まれた引用符は正しく処理されないため安全ではありません)。あなたのケースの代わりに'$$で、それが失敗した -

関数定義は、引用符の間に置かれています。それがスクリプト化することができます。もちろん、

[email protected]:~$ export CRS=33 
[email protected]:~$ psql t << EOF 
> CREATE OR REPLACE FUNCTION point() RETURNS trigger 
> LANGUAGE plpgsql 
> AS \$\$ 
> BEGIN 
> NEW.the_geom:=ST_SetSRID(geom, $CRS) ; 
> RETURN NEW; 
> END 
> \$\$; 
> \sf point() 
> EOF 
CREATE FUNCTION 
CREATE OR REPLACE FUNCTION public.point() 
RETURNS trigger 
LANGUAGE plpgsql 
AS $function$ 
BEGIN 
NEW.the_geom:=ST_SetSRID(geom, 33) ; 
RETURN NEW; 
END 
$function$ 

:あなたは、あなたの代わりにbashの変数を使用して試すことができます回避策として

(もちろん、関数本体を台無しに)それが再び処理されて起動を参照しST_SetSRID(geom, $$:CRS)ST_SetSRID(geom, :CRS)を変更することができます引数が

関連する問題