# 38.6.函数重载
可以使用相同的SQL名称定义多个函数,只要它们采用的参数不同。换句话说,函数名可以是超载。无论您是否使用它,在某些用户不信任其他用户的数据库中调用函数时,此功能都需要采取安全预防措施;看见第10.3节.执行查询时,服务器将根据数据类型和提供的参数数量确定要调用的函数。重载也可用于模拟参数数量可变的函数,最大数量为有限。
在创建重载函数族时,应小心不要产生歧义。例如,给定函数:
CREATE FUNCTION test(int, real) RETURNS ...
CREATE FUNCTION test(smallint, double precision) RETURNS ...
目前还不清楚哪一个函数会被一些琐碎的输入调用,比如测试(1,1.5)
。中描述了当前实施的处置规则第十章,但设计一个微妙地依赖这种行为的系统是不明智的。
采用复合类型的单个参数的函数通常不应与该类型的任何属性(字段)具有相同的名称。还记得吗*
属性*(*
桌子*)
被认为相当于*
桌子*.*
属性*
.如果复合类型上的函数与该复合类型的属性之间存在歧义,则将始终使用该属性。可以通过模式限定函数名(即,*
模式*.*
func*(*
桌子*)
)但最好不要选择相互冲突的名字来避免这个问题。
另一个可能的冲突是可变函数和非可变函数之间的冲突。例如,两者都可以创建foo(数字)
和foo(可变数字[])
.在这种情况下,不清楚哪一个应与提供单个数字参数的调用匹配,例如傅(10.1)
.规则是使用搜索路径中出现较早的函数,或者如果两个函数在同一个模式中,则首选非变量函数。
重载C语言函数时,还有一个附加约束:重载函数族中每个函数的C名称必须不同于所有其他函数的C名称,无论是内部加载的还是动态加载的。如果违反此规则,则该行为不可移植。您可能会遇到运行时链接器错误,或者会调用其中一个函数(通常是内部函数)。另一种形式的像
SQL语句的创建函数
命令将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函数的名称反映了许多可能的约定之一。