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

Postgresql 用函数替换postgres脚本的psql变量,postgresql,psql,Postgresql,Psql,我有一个Postgres脚本,我打算在多个数据库上运行它。示例SQL包含如下函数和表 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) );

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

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-ddb-p5432-U用户名-h localhost-f test.sql--variable=CRS=3857

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

因此,诸如“:foo”这样的构造无法生成 引用变量值中的文字(如果 确实有效,因为它无法正确处理 价值)

函数定义放在引号之间-在您的例子中是
$$
而不是
'
,因此它失败。您可以将
ST_setrid(geom,:CRS)
更改为
ST_setrid(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$
vao@vao-虚拟箱:~$export CRS=33
vao@vao-VirtualBox:~$psql t CREATE或REPLACE函数点()返回触发器
>语言plpgsql
>作为\$\$
>开始
>新的。_geom:=ST_setrid(geom,$CRS);
>归还新的;
>结束
> \$\$;
>\sf点()
>EOF
创建函数
创建或替换函数public.point()
返回触发器
语言plpgsql
作为$function$
开始
新的。_geom:=ST_SetGrid(geom,33);
归还新的;
结束
$function$

当然,它可以被脚本化为一个文件,您可以使用参数调用它作为bash

,这可能是因为plpgsql有“:”操作符,而sql没有?。。