用函数替换postgres脚本的psql变量

时间:2017-06-08 08:10:12

标签: postgresql psql

我有一个Postgres脚本,我打算对多个数据库运行。示例SQL包含函数和表,如

<div id="falshContentID"></div>

我在内部放了一个变量,以便我可以在运行时替换它作为
 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) );

为什么变量只在表定义中被正确替换而不是函数定义

1 个答案:

答案 0 :(得分:0)

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

  

因此,诸如':foo'之类的结构无法生成a   从变量的值引用文字(如果它是不安全的   确实有效,因为它无法正确处理嵌入的引号   值)。

函数定义放在引号之间 - 在您的情况下$$而不是',因此失败。您可以将ST_SetSRID(geom, :CRS)更改为ST_SetSRID(geom, $$:CRS),以便再次开始处理它(当然会毁掉函数体)

作为一种解决方法,您可以尝试使用bash变量:

vao@vao-VirtualBox:~$ export CRS=33
vao@vao-VirtualBox:~$ 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调用