我可以使用
将变量传递给PostgreSQLpsql --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 ":"
如何解决这个问题?
答案 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过程。