2017-06-08 19 views
0

我有一個Postgres腳本,我有,我打算針對多個數據庫運行。樣本SQL具有的功能和表像psql變量替換postgres腳本與功能

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)  
); 

我已經把一個變量中,這樣我可以在運行時用它替換爲
psql -d db -p 5432 -U username -h localhost -f test.sql --variable=CRS=3857

爲什麼該變量只得到正確的表定義取代,而不是函數定義

+0

也許是因爲plpgsql有':'運算符和sql不? –

回答

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

因此,建設的影響例如':foo'不能用於從變量的值生成 帶引號的文字(如果 確實起作用,將會不安全,因爲它無法正確處理嵌入在 值中的引用)。

函數定義放在引號之間 - 在你的情況下,$$而不是',所以失敗。您可以更改ST_SetSRID(geom, :CRS)ST_SetSRID(geom, $$:CRS)看到它開始再次處理(當然破壞了函數體)

作爲一種變通方法,你可以嘗試使用bash變量而不是:

[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的參數