2016-09-22 79 views
0

我正在使用Postgres,並且我想創建一個安全函數來減少腳本中的某些重複。從腳本內嵌調用INSERT函數

我有一個函數定義如下:

CREATE FUNCTION add_entry(i smallint, m varchar, t varchar) RETURNS VOID AS $$ 
    BEGIN 
    INSERT INTO metrics(id, medium, metric) VALUES (i, m, t); 
    END 
$$ LANGUAGE 'plpgsql'; 

我當時想打電話給我的腳本功能如下:

SELECT add_entry(3, "hello", "world"); 

當我調用腳本的函數定義隨後調用該函數,隨後調用該函數,則會生成以下錯誤:

psql:static-data.sql:7: ERROR: function "add_entry" already exists with same argument types 
SELECT "add_entry"(3, "hello", "world"); 
psql:static-data.sql:9: ERROR: column "hello" does not exist 
LINE 1: SELECT "add_entry"(3, "hello", "world"); 

問題出現,當我調用函數時,它的行爲就像函數的重新定義一樣。

如何解決此問題並直接調用函數?非常感謝你的幫助!

回答

0

您只需創建一次該功能。你可以這樣想:函數是模式的一部分,就像表格一樣。每次運行腳本時都不會創建表,那麼爲什麼每次都要創建函數呢?

現在,如果你真的要重新定義功能,您可以那樣做:

CREATE OR REPLACE FUNCTION add_entry... 

這將刪除舊的定義和創造,在其設立一個新的一個。

+0

啊這是有道理的。有沒有辦法強制重新定義函數。像放下前面的函數並重新定義它? –

+0

完美,我看到你的更新答案;非常感謝! –

+0

@JamesTaylor注意'CREATE OR REPLACE FUNCTION'有時候可能很挑剔,例如:它不會允許您簡單地更改變量的名稱。所以有時候,你可能不得不放棄第一個功能。 – redneb