PostgreSQL使用变量名作为字符串文字

时间:2017-08-31 20:27:55

标签: postgresql triggers plpgsql

在这个脚本中,我希望输出为:

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');

1 个答案:

答案 0 :(得分:3)

来自the documentation(强调补充):

  

<强> 参数

     

执行触发器时要提供给函数的可选逗号分隔的参数列表。参数是文字字符串常量。简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。

CREATE TRIGGER是一个DDL命令,其中的变量是未知的。在这种情况下,您需要dynamic SQL来使用变量。另请参阅this post.