代码之家  ›  专栏  ›  技术社区  ›  Denis Rouzaud

在postgresql execute语句中使用变量

  •  1
  • Denis Rouzaud  · 技术社区  · 8 年前

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

    我一直在尝试使用以下代码:

    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$;
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Pavel Stehule    8 年前

    不能在任何sql字符串中使用psql变量。绳子是 DO 命令也是。您可以使用会话变量:

    \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