2016-06-09 31 views
2

我的SQL脚本包含以下内容:使用组可变

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

我在尝试评估测试的值时,语法错误:

ERROR: syntax error at or near ":" 

理想我喜欢有一个匿名plpqsql块生活在一个文件中,然后使用一组环境变量从shell脚本中调用

+0

这个答案证明的替代解决方案的重复。 –

回答

0

解释是,according to the manual

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

DO声明的正文是一个美元引用的字符串。所以在字符串里面没有插值。

由于它必须是文字字符串,因此您也可以不用动态连接字符串。 The manual:

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

但是,您可以连接字符串,然后执行它。

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

设置PSQL变量名值,或如果超过给出一个值 ,他们所有人的串联。

大胆强调我的。你只需要得到合适的报价:

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相关答案细节: