Cha*_*ffy 3 postgresql scope plpgsql psql
我可以使用
psql --variable="var='value'" <<<'SELECT :var'
Run Code Online (Sandbox Code Playgroud)
...并在这种情况下将它们称为:var在标准输入上传递给 psql 的 SQL 查询中。
但是,这不适用于使用 PL/PGSQL 的代码:
psql --variable=var="'value'" <<'EOF'
DO $$
BEGIN
SELECT :var;
END;
$$
EOF
Run Code Online (Sandbox Code Playgroud)
...产生错误:
ERROR: syntax error at or near ":"
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
您不能直接在 plpgsql 代码中使用 psql 变量。符号替换被阻止在字符串中:
postgres=> select :'xx';
?column?
----------
AHOJ
(1 row)
postgres=> select ' :xx ';
?column?
----------
:xx
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是您可以设置服务器会话变量,然后在 plpgsql 代码中使用这种变量(在服务器端):
postgres=> set myvars.xx = :'xx';
SET
postgres=> do $$ begin
raise notice '>>%<<', current_setting('myvars.xx');
end $$;
NOTICE: >>AHOJ<<
DO
Run Code Online (Sandbox Code Playgroud)
您可以从命令行使用相同的技术,请参阅:http : //okbob.blogspot.cz/2015/01/how-to-push-parameters-to-do-statement.html
最后一点 - 代码
开始 选择一些; 结尾;
在 plpgsql 中无效。任何SELECTs 的结果都应该存储在一些变量中。Postgres 不可能SELECT向客户端返回免费的结果-DO语句不等同于 MS SQL 过程。