2017-06-08 5 views
0

J'ai un script Postgres que j'ai l'intention d'exécuter sur plusieurs bases de données. L'exemple SQL a des fonctions et des tables commePsql substitution de variable pour le script Postgres avec des fonctions

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

J'ai mis une variable à l'intérieur afin que je puisse le remplacer à l'exécution comme
psql -d db -p 5432 -U username -h localhost -f test.sql --variable=CRS=3857

Pourquoi la variable ne se correctement substitué dans les définitions de table et non définition de la fonction

+0

peut-être parce que plpgsql a l'opérateur ':' et que sql ne le fait pas? –

Répondre

0

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

par conséquent, une s de construction uch comme ': foo' ne fonctionne pas pour produire un littéral entre la valeur d'une variable (et il serait dangereux si fonctionnait, car il ne traiterait pas correctement les guillemets incorporés dans la valeur ).

une définition de fonction est mis entre guillemets - dans votre cas $$ au lieu de ', il échoue. Vous pouvez modifier ST_SetSRID(geom, :CRS) à ST_SetSRID(geom, $$:CRS) pour le voir commencer à être manipulé à nouveau (ruinant bien sûr le corps de la fonction)

Pour contourner ce problème, vous pouvez essayer d'utiliser à la place variable 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$ 

Bien sûr, il peut être scriptée un fichier que vous pouvez appeler comme bash avec l'argument