Ссылаясь на переменные сеанса (\set var='value') из PL/PGSQL

Я могу передавать переменные в PostgreSQL, используя

psql --variable="var='value'" <<<'SELECT :var'

... и обращаться к ним как, в данном случае, к :var в SQL-запросах, передаваемых в psql на стандартный ввод.

Однако это не работает из кода, использующего PL/PGSQL:

psql --variable=var="'value'" <<'EOF'
  DO $$
  BEGIN
    SELECT :var;
  END;
  $$
EOF

... выдает ошибку:

ERROR:  syntax error at or near ":"

Как это можно решить?


person Charles Duffy    schedule 05.03.2015    source источник


Ответы (1)


Вы не можете напрямую использовать переменные psql внутри кода plpgsql. Подстановка символов заблокирована внутри строк:

postgres=> select :'xx';
 ?column? 
----------
 AHOJ
(1 row)

postgres=> select ' :xx ';
?column? 
----------
 :xx 
(1 row)

Но вы можете установить переменные сеанса сервера, а затем использовать такие переменные в коде plpgsql (на стороне сервера):

postgres=> set myvars.xx = :'xx';
SET
postgres=> do $$ begin 
                   raise notice '>>%<<', current_setting('myvars.xx');
                 end $$;
NOTICE:  >>AHOJ<<
DO

Вы можете использовать тот же метод из командной строки, см.: http://okbob.blogspot.cz/2015/01/how-to-push-parameters-to-do-statement.html

последнее примечание - код

BEGIN
  SELECT some;
END;

недействителен в plpgsql. Результаты любых SELECT должны храниться в некоторых переменных. Postgres не имеет возможности вернуть результат бесплатного SELECT клиенту - оператор DO не эквивалентен процедуре MS SQL.

person Pavel Stehule    schedule 05.03.2015