从 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 【问题描述】:我可以使用
将变量传递到 PostgreSQLpsql --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 中无效。任何SELECT
s 的结果都应该存储在一些变量中。 Postgres 不可能将免费SELECT
的结果返回给客户端 - DO
语句不等同于 MS SQL 过程。
【讨论】:
以上是关于从 PL/PGSQL 引用会话变量 (\set var='value')的主要内容,如果未能解决你的问题,请参考以下文章