↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.

9.6. 函数重载 #

可以用同一个 SQL 名称定义多个函数,只要它们接受的参数不同即可。换句话说,函数名可以被重载。当一个查询被执行时,服务器将根据所提供参数的数据类型和数量来决定要调用哪个函数。重载也可用来模拟具有可变参数个数(最大个数有限)的函数。

函数也可以与属性同名。当复合类型上的函数与该复合类型的属性存在歧义时,总是使用属性。

在创建一个重载函数家族时,应该小心不要创建歧义。例如,给定函数:

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

对诸如 test(1, 1.5) 这样的简单输入,哪个函数会被调用并不直接明了。当前实现的解析规则在用户指南中描述,但设计一个微妙地依赖此行为的系统是不明智的。

重载 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 函数的名称反映了多种可能约定中的一种。

在 PostgreSQL 7.0 之前,这种替代语法不存在。有一个绕过该问题的技巧:先定义一组名称不同的 C 函数,然后定义一组同名的 SQL 函数包装器,它们接受适当的参数类型并调用相匹配的 C 函数。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.