2014-05-13 117 views
0

有誰知道如何將PLPGSQL函數的主體設置爲另一個函數的結果文本?例如,這是我曾嘗試:從另一個函數的結果創建PLPGSQL函數

CREATE FUNCTION "Foo"() RETURNS TEXT AS $$ 
    BEGIN 
     RETURN 'BEGIN END;'; 
    END; 
$$ LANGUAGE PLPGSQL; 

CREATE FUNCTION "Bar"() RETURNS TRIGGER AS "Foo"() LANGUAGE PLPGSQL; 

我想被創建,使得它等同於以下是「酒吧」:

CREATE FUNCTION "Bar"() RETURNS TRIGGER AS $$ 
    BEGIN END; 
$$ LANGUAGE PLPGSQL; 

有誰知道如何完成這樣的事情(例如,根據另一個函數的結果定義一個函數體)?謝謝,

+2

這可以做到,但它是醜陋的和安全的噩夢。你能解釋一下你爲什麼要這樣做嗎?提供上下文可能會導致解決問題的不同方式。 – Patrick

+2

如果你確實想這樣做,可以使用'EXECUTE'來運行'format(...)'生成的'CREATE FUNCTION'子句的文本。但爲什麼你不只有一個函數調用另一個? –

+0

另請注意,如果這是您想要實現的,那麼觸發器函數也可以有自己的參數。 f.ex. 'CREATE TRIGGER ... EXECUTE PROCEDURE「Bar」('param 1 val',42);' – pozs

回答

1

感謝Craig Ringer的建議。這是我最終編寫的代碼來生成函數:

CREATE FUNCTION "Foo"() RETURNS VOID AS $$ 
    BEGIN 
     EXECUTE 
      'CREATE FUNCTION ' || QUOTE_IDENT('Bar') || '() RETURNS TRIGGER AS $a$' || chr(10) || 
      'BEGIN' || chr(10) || 
      'END;' || chr(10) || 
      '$a$ LANGUAGE PLPGSQL;'; 
    END; 
$$ LANGUAGE PLPGSQL; 
相關問題