Ale*_*exC 3 postgresql types casting plpgsql postgresql-9.3
我的用户和我不使用PL/pgSQL中的函数重载.我们每个(模式,名称)元组总是有一个函数.因此,我们只想按名称删除函数,更改其签名而不必先删除它等.例如,考虑以下函数:
CREATE OR REPLACE FUNCTION myfunc(day_number SMALLINT)
RETURNS TABLE(a INT)
AS
$BODY$
BEGIN
RETURN QUERY (SELECT 1 AS a);
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
为了节省时间,我们想按如下方式调用它,而不用限定1 ::SMALLINT,因为只有一个名为myfunc的函数,它只有一个名为day_number的参数:
SELECT * FROM myfunc(day_number := 1)
Run Code Online (Sandbox Code Playgroud)
没有歧义,值1与SMALLINT类型一致,但PostgreSQL抱怨:
SELECT * FROM myfunc(day_number := 1);
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: function myfunc(day_number := integer) does not exist LINE 12: SELECT * FROM myfunc(day_number := 1); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
当我们从Python调用这些函数时,我们使用一个包装器来查找函数的签名并使用类型限定参数.这种方法有效,但似乎有可能改进.
有没有办法完全关闭功能重载?
欧文发了正确答复.我的下一个回复与禁用重载的可能性有关.
无法禁用重载 - 这是PostgreSQL函数API系统的基本功能 - 无法禁用.我们知道有一些副作用,比如强大的功能特征刚性 - 但是当在视图,表定义中使用函数时,它可以防止一些令人不快的副作用.所以你不能禁用它.
您只需检查您是否有重载功能:
postgres=# select count(*), proname
from pg_proc
where pronamespace <> 11
group by proname
having count(*) > 1;
count | proname
-------+---------
(0 rows)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |