【问题标题】: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 ":"

如何解决?

【问题讨论】:

    标签: postgresql scope plpgsql psql


    【解决方案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 过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 2017-05-13
      • 2015-06-18
      • 1970-01-01
      • 2021-05-04
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多