在plpgsql declare block中使用\ set变量

时间:2016-06-09 01:07:17

标签: postgresql plpgsql psql

我的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脚本调用

1 个答案:

答案 0 :(得分: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的相关答案的详细信息: