【问题标题】:use \set variable inside plpgsql declare block [duplicate]在 plpgsql 声明块中使用 \set 变量 [重复]
【发布时间】:2016-06-09 01:07:17
【问题描述】:

我的 SQL 脚本包含以下内容:

\set test 'some value'  
DO $$DECLARE  
  v_test text:= :'test';  
BEGIN  
  RAISE NOTICE 'test var is %',v_test;  
END$$;  

尝试评估 test 的值时出现语法错误:

ERROR:  syntax error at or near ":"  

理想情况下,我希望有一个匿名的 plpqsql 块存在于一个文件中,然后使用一组环境变量从 shell 脚本调用该块

【问题讨论】:

  • 这个答案演示了重复的替代解决方案。

标签: postgresql plpgsql psql


【解决方案1】:

解释是,according to the manual:

在引用的 SQL 文字和标识符中不会执行变量插值。

DO 语句的主体是一个美元引号字符串。所以字符串内部没有插值。

由于它必须是文字字符串,因此您也不能即时连接字符串。 The manual:

这必须指定为字符串文字,就像在CREATE FUNCTION 中一样。

但是你可以将字符串连接起来然后执行。

\set [ name [ value [ ... ] ] ]

将 psql 变量名称设置为 value,或 如果有多个值 给定,所有这些的串联。

我的大胆强调。您只需要正确引用即可:

test=# \set test 'some value'
test=# \set code 'DECLARE v_test text := ' :'test' '; BEGIN RAISE NOTICE ''test var is: %'', v_test; END'
test=# DO :'code';
NOTICE: test var is: some value
DO
test=#

但我宁愿创建一个(临时)函数并将值作为参数传递(psql 插值工作的地方)。 dba.SE 上此相关答案的详细信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多