从PL / PGSQL引用会话变量(\ set var =' value')

时间:2015-03-05 01:38:51

标签: postgresql scope plpgsql psql

我可以使用

将变量传递给PostgreSQL
psql --variable="var='value'" <<<'SELECT :var'

...在这种情况下,将它们称为在{stdin上传递给psql的SQL查询中的:var

但是,这不适用于使用PL / PGSQL的代码:

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

...产生错误:

ERROR:  syntax error at or near ":"

如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

你不能直接在plpgsql代码中使用psql变量。符号替换在字符串中被阻止:

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不可能将free SELECT的结果返回给客户端 - DO语句不等同于MS SQL过程。