2017-08-31 1 views
2

In diesem Skript erwartete ich die Ausgabe zu sein:PostgreSQL Variablennamen als Stringliteral

NOTICE: 00000: Outside value is: hello 
NOTICE: 00000: Inside value is: hello 

aber der Ausgang war:

NOTICE: 00000: Outside value is: hello 
NOTICE: 00000: Inside value is: my_variable 

Warum PostgreSQL mit dem Namen der Variablen als String-Literal beim Übergeben an die Funktion? Beachten Sie, dass ich den Variablennamen nicht in Anführungszeichen gesetzt habe, sodass ich nicht erwartet habe, dass er als Zeichenfolgenliteral interpretiert wird. Hier

ist das Skript:

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

Antwort

3

Von the documentation (Hervorhebung hinzugefügt):

Argumente

Eine optionale durch Kommata getrennte Liste von Argumenten zur Verfügung gestellt werden, um die Funktion, wenn der Trigger ausgeführt wird. Die Argumente sind Literal String Konstanten. Einfache Namen und numerische Konstanten können hier ebenfalls geschrieben werden, aber alle werden in Strings umgewandelt.

CREATE TRIGGER ist ein DDL-Befehl, in dem Variablen nicht bekannt sind. Sie benötigen dynamic SQL, um in diesem Fall eine Variable zu verwenden. Siehe auch this post.

+1

Ha! Danke, ich habe auf eine andere Dokumentationsseite geschaut, die das nicht so klar gemacht hat. – MondKin