在这个脚本中,我希望输出为:
NOTICE: 00000: Outside value is: hello
NOTICE: 00000: Inside value is: hello
但输出是:
NOTICE: 00000: Outside value is: hello
NOTICE: 00000: Inside value is: my_variable
为什么PostgreSQL在将变量传递给函数时使用变量名作为字符串文字?注意我没有在变量名称周围加上单引号,所以我不希望它被解释为字符串文字。
这是脚本:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table(my_field text);
CREATE OR REPLACE FUNCTION my_function() RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'Inside value is: %', TG_ARGV[0];
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DO $$
DECLARE
my_variable text := 'hello';
BEGIN
RAISE NOTICE 'Outside value is: %', my_variable;
CREATE TRIGGER my_trigger
AFTER INSERT ON my_table
FOR EACH ROW
EXECUTE PROCEDURE my_function(my_variable);
END
$$;
INSERT INTO my_table VALUES('some value');
答案 0 :(得分:3)
来自the documentation(强调补充):
<强> 参数 强>
执行触发器时要提供给函数的可选逗号分隔的参数列表。参数是文字字符串常量。简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。
CREATE TRIGGER是一个DDL命令,其中的变量是未知的。在这种情况下,您需要dynamic SQL来使用变量。另请参阅this post.