Как передать переменную psql в раздел DECLARE кода PL / pgSQL? - PullRequest
1 голос
/ 30 сентября 2019

Я хочу использовать дополнительную переменную в разделе объявления кода PL / pgSQL в PostgreSQL.

DO $ANONYMOUS_BLOCK$ declare
   user_c cursor is
   select username
   from   users
   where upper(:v1) in ('ALL',upper(component_id)) order by username;
begin
   /* data */
end $ANONYMOUS_BLOCK$;

Команда оболочки:

psql -f test.psql -v v1='SR'

Я пробовал несколько случаев, чтобы получитьзначение 'SR' в приведенной выше функции, но не удалось его достичь.

Ожидаемый результат:

DO $ANONYMOUS_BLOCK$ declare
   user_c cursor is
   select username
   from   users
   where upper('SR') in ('ALL',upper(component_id)) order by username;
begin
   /* data */
end $ANONYMOUS_BLOCK$;

Необходимо получить значение 'SR' вместо v1.

Я получаю эту ошибку:

psql:test.psql:13: ERROR:  syntax error at or near ":"
LINE 5:    where  :v1 in ('ALL',upper(component_id)) order by userna...

1 Ответ

1 голос
/ 03 октября 2019

Руководство для psql:

Переменная интерполяция не будет выполняться в пределах указанных литералов SQL и идентификаторов.

Тело оператора * (или функции) DO является литералом в кавычках. Доллар в данном случае цитируется, но все равно.

Мне пришлось дать такой же отрицательный ответ в этом недавнем ответе на dba.SE:

Но есть различные обходные пути, и я предоставил некоторые там.

ЛегкоНапример, для вашего случая можно создать временную функцию вместо оператора DO и сразу вызвать ее. Тогда вы можете легко передавать переменные. Запишите это в свой файл test.psql:

CREATE FUNCTION pg_temp.foo(_v1 text)
  RETURNS void AS  -- can also return sth. (as opposed to DO)
$func$
DECLARE
   user_c cursor is
   SELECT username
   FROM   users
   WHERE  upper(_v1) IN ('ALL', upper(component_id))
   ORDER  BY username;
BEGIN
   RAISE NOTICE '%', _v1;  -- to demonstrate
   -- more
END 
$func$  LANGUAGE plpgsql;

SELECT pg_temp.foo(:'v1'); -- call with psql variable interpolation

Затем вызовите его из psql или непосредственно из оболочки:

Оболочка Linux:

psql -f '\path\to\file\test.psql' -v v1='SR'

Оболочка Windows:

"C:\Program Files\PostgreSQL\12\bin\psql" -p 5432 -U postgres -f "C:\path\to\file\test.psql" -v v1='SR'

Адаптировать пути к файлам и параметры подключения к вашим настройкам.

Помимо: , серьезно? Не поддерживается с 2017 года. Рассмотрите возможность обновления до текущей версии.

...