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