历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
33.8. 函数重载 #
可以用同一个 SQL 名称定义多个函数,只要它们接受的参数不同即可。换句话说,函数名可以被重载。当一个查询被执行时,服务器将根据所提供参数的数据类型和数量来决定要调用哪个函数。重载也可用来模拟具有可变参数个数(最大个数有限)的函数。
函数也可以与属性同名。(回忆一下,attribute(table)
等价于
table.attribute。)当复合类型上的函数与该复合类型的属性存在歧义时,总是使用属性。
在创建一个重载函数家族时,应该小心不要创建歧义。例如,给定函数:
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
对于test(1, 1.5)这样的输入就无法立刻清楚地知道应该调用哪个函数。当前实现的解决规则在第 10 章中有描述,但是设计一个依赖于这种行为的系统是不明智的。
重载
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 函数的名称反映了多种可能约定中的一种。