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

Posted

技术标签:

【中文标题】从 PL/PGSQL 引用会话变量 (\\set var=\'value\')【英文标题】:Referring to session variables (\set var='value') from PL/PGSQL从 PL/PGSQL 引用会话变量 (\set var='value') 【发布时间】:2015-03-05 01:38:50 【问题描述】:

我可以使用

将变量传递到 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 ":"

如何解决?

【问题讨论】:

【参考方案1】:

您不能直接在 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

最后一点 - 代码

开始 选择一些; 结尾;

在 plpgsql 中无效。任何SELECTs 的结果都应该存储在一些变量中。 Postgres 不可能将免费SELECT 的结果返回给客户端 - DO 语句不等同于 MS SQL 过程。

【讨论】:

以上是关于从 PL/PGSQL 引用会话变量 (\set var='value')的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/PGSQL 动态 SQL 内部函数中引用局部变量

PL/PGSQL - 无法将 SELECT 语句中的 array_agg 分配给变量

如何纠正 PL/pgSQL 中缺少引用的“一对多表”?

在 PL/pgSQL 匿名块中引用 psql 参数

在 PL/pgSQL 函数中使用变量

使用 PL/pgSQL 将查询结果存储在变量中