Используйте переменную в операторе выполнения postgresql - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь получить параметр при создании функции триггера.

Я пытался использовать этот код:

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 , но подготовленные операторы не позволяют создать функцию триггера.

Есть идеи?


РЕШЕНИЕ

Спасибо @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 Ответ

0 голосов
/ 05 июля 2018

Вы не можете использовать переменные psql внутри любой строки SQL. Строка также является телом команды 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

...