gpt4 book ai didi

postgresql - 在 postgresql 执行语句中使用变量

转载 作者:行者123 更新时间:2023-11-29 13:14:13 25 4
gpt4 key购买 nike

我在创建触发器函数时尝试使用参数。

我一直在尝试使用这段代码:

DO $DO$
BEGIN
EXECUTE format($TRIGGER$
CREATE OR REPLACE FUNCTION my_schema.my_trigger_fcn() RETURNS trigger AS
$BODY$
DECLARE
my_geom geometry(MultiPoint,%1$s);
BEGIN
my_geom = st_collect(NEW.situation_geometry)::geometry(MultiPoint,%$1s);
NEW.geometry = my_geom;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
$TRIGGER$, :SRID);
END
$DO$;

并尝试使用 psql -v SRID=2056 -f myfile 运行此代码。但是我收到语法错误。

我也试过 SQL execute命令,但准备好的语句是 not allowed创建触发函数。

有什么想法吗?


解决方案:

感谢@Pavel Stehule,这是有效的代码:

SELECT set_config('my.srid', :SRID::text, false);
DO $DO$
BEGIN
EXECUTE format($TRIGGER$
CREATE OR REPLACE FUNCTION qgep_od.my_trigger_fcn() RETURNS trigger AS
$BODY$
DECLARE
my_geom geometry(MultiPoint,%1$s);
BEGIN
my_geom = st_collect(NEW.situation_geometry)::geometry(MultiPoint,%1$s);
NEW.geometry = my_geom;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
$TRIGGER$, current_setting('my.srid'));
END
$DO$;

最佳答案

您不能在任何 SQL 字符串中使用 psql 变量。该字符串也是 DO 命令的主体。您可以使用 session 变量:

\set myvar xxx
select set_config('my.myvar', :'myvar', false);
do $$
begin
execute format('create or replace function fx() returns void as $_$begin raise notice %L; end$_$ language plpgsql', current_setting('my.myvar'));
end;
$$;

postgres=# \sf fx
CREATE OR REPLACE FUNCTION public.fx()
RETURNS void
LANGUAGE plpgsql
AS $function$begin raise notice 'xxx'; end$function$

其他可能性是在 psql 之前进行此替换 - 您可以使用 sed

关于postgresql - 在 postgresql 执行语句中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51192840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com