我的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脚本调用
答案 0 :(得分:1)
不会在引用的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的相关答案的详细信息: