2016-09-22 3 views
0

В настоящее время я использую Postgres, и я хочу создать функцию connivence, чтобы сократить некоторые повторения в моих скриптах.Вызов функции INSERT inline из сценария

У меня есть функция, определенная следующим образом:

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 или REPLACE FUNCTION' может быть придирчивым иногда, например. он не позволит вам просто изменить имя переменной. Поэтому иногда вам, возможно, придется сначала отбросить функцию. – redneb

Смежные вопросы