2016-09-22 7 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

関数を1回作成するだけで済みます。このように考えることができます。関数は表のようにスキーマの一部です。スクリプトを実行するたびにテーブルを作成しないので、毎回その関数を作成するのはなぜですか?今

、あなたは本当にあなたがそのようにそれを行うことができます機能を再定義する必要がある場合:

CREATE OR REPLACE FUNCTION add_entry... 

これは、古い定義を削除し、その場所に新しいものを作成します。

+0

これは意味があります。関数の再定義を強制する方法はありますか?以前の関数を削除して再定義するのと同じですか? –

+0

パーフェクト、私はあなたの更新された答えを参照してください。どうもありがとうございます! –

+0

@JamesTaylor「CREATE OR REPLACE FUNCTION」は時には厄介なことに注意してください。単に変数の名前を変更することはできません。だから時には、関数を最初に削除する必要があるかもしれません。 – redneb