从 PL/PGSQL 引用会话变量 (\set var='value')
Referring to session variables (\set var='value') from PL/PGSQL
我可以使用
将变量传递给 PostgreSQL
psql --variable="var='value'" <<<'SELECT :var'
...并在这种情况下将它们称为 :var
in SQL 查询传递给 stdin 上的 psql。
但是,这不适用于使用 PL/PGSQL 的代码:
psql --variable=var="'value'" <<'EOF'
DO $$
BEGIN
SELECT :var;
END;
$$
EOF
...产生错误:
ERROR: syntax error at or near ":"
如何解决?
您不能直接在 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 不可能 returns 免费 SELECT
结果给客户端 - DO
语句不等同于 MS SQL 过程。
我可以使用
将变量传递给 PostgreSQLpsql --variable="var='value'" <<<'SELECT :var'
...并在这种情况下将它们称为 :var
in SQL 查询传递给 stdin 上的 psql。
但是,这不适用于使用 PL/PGSQL 的代码:
psql --variable=var="'value'" <<'EOF'
DO $$
BEGIN
SELECT :var;
END;
$$
EOF
...产生错误:
ERROR: syntax error at or near ":"
如何解决?
您不能直接在 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 不可能 returns 免费 SELECT
结果给客户端 - DO
语句不等同于 MS SQL 过程。