2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

36.6. 函数重载 #

可以定义多个具有相同 SQL 名称的函数,只要它们接受的参数不同。换句话说,函数名称可以被重载。无论您是否使用它,这种能力都带来了安全注意事项,在调用数据库中某些用户不信任其他用户的函数时尤为如此;请参阅第 10.3 节。当查询执行时,服务器将根据提供的参数的数据类型和数量来确定调用哪个函数。重载还可以用于模拟具有可变数量参数的函数,最多可达一个有限的最大数量。

在创建一组重载函数时,应注意不要产生歧义。例如,给定函数

CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...

对于一些简单的输入,例如 test(1, 1.5),不清楚会调用哪个函数。目前实现的解析规则在第 10 章中有描述,但设计一个微妙依赖于此行为的系统是不明智的。

通常,接受单个复合类型参数的函数不应与该类型的任何属性(字段)具有相同的名称。请记住,attribute(table) 被视为等同于 table.attribute。在这种情况下,如果复合类型上的函数和复合类型的属性之间存在歧义,则将始终使用属性。可以通过模式限定函数名称(即 schema.func(table) )来覆盖此选择,但最好避免选择冲突的名称来解决问题。

另一个可能的冲突是可变参数函数和非可变参数函数之间。例如,可以同时创建 foo(numeric)foo(VARIADIC numeric[])。在这种情况下,不清楚哪个函数应该匹配提供单个数值参数的调用,例如 foo(10.1)。规则是使用搜索路径中较早出现的函数,或者如果两个函数在同一个模式下,则优先选择非可变参数函数。

重载 C 语言函数时,还有一个额外的限制:重载函数族中每个函数的 C 名称必须不同于所有其他函数(内部或动态加载)的 C 名称。如果违反此规则,行为将不可移植。您可能会遇到运行时链接器错误,或者其中一个函数将被调用(通常是内部函数)。 SQL CREATE FUNCTION 命令的 AS 子句的替代形式将 SQL 函数名称与其在 C 源代码中的函数名称解耦。例如

CREATE FUNCTION test(int) RETURNS int
    AS 'filename', 'test_1arg'
    LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
    AS 'filename', 'test_2arg'
    LANGUAGE C;

这里的 C 函数名称反映了众多可能约定中的一种。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的经验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。