gpt4 book ai didi

postgresql - 有没有办法在 Postgres 中禁用函数重载

转载 作者:行者123 更新时间:2023-11-29 11:38:24 27 4
gpt4 key购买 nike

我的用户和我不在 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;

为了节省时间,我们想按如下方式调用它,而不用 ::SMALLINT 限定 1,因为只有一个名为 myfunc 的函数,并且它只有一个名为 day_number 的参数:

SELECT * FROM myfunc(day_number := 1)

没有歧义,值 1 与 SMALLINT 类型一致,但 PostgreSQL 报错:

SELECT * FROM myfunc(day_number := 1);
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 调用此类函数时,我们使用一个包装器来查找函数的签名并使用类型限定参数。这种方法有效,但似乎还有改进的潜力。

有没有办法完全关闭函数重载?

最佳答案

Erwin 发送了正确的回复。我的下一个回复与禁用过载的可能性有关。

无法禁用重载 - 这是 PostgreSQL 函数 API 系统的基本功能 - 并且无法禁用。我们知道有一些副作用,比如强大的函数签名刚性——但是当函数在 View 、表定义中使用时,它可以防止一些令人不快的副作用,所以你不能禁用它。

您可以简单地检查您是否有或没有重载函数:

postgres=# select count(*), proname 
from pg_proc
where pronamespace <> 11
group by proname
having count(*) > 1;
count | proname
-------+---------
(0 rows)

关于postgresql - 有没有办法在 Postgres 中禁用函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28698641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com