我有一个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)
);
为什么变量只在表定义中被正确替换而不是函数定义
答案 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调用