2017-08-31 79 views
2

在這個劇本我所期望的輸出是:的PostgreSQL使用變量名作爲字符串字面

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

回答

3

the documentation(強調):

參數

可選的參數逗號分隔的列表被提供給觸發器執行時的函數。參數是文字字符串常量。簡單的名字和數字常量也可以寫在這裏,但是它們都會被轉換爲字符串。

CREATE TRIGGER是一個DDL命令,其中變量未知。在這種情況下,您需要使用dynamic SQL來使用變量。另請參閱this post.

+1

哈!謝謝,我看了一個不太清楚的文檔頁面。 – MondKin

相關問題