只要函数所接受的参数不同,就可以定义多个具有相同 SQL 名称的函数。换句话说,函数名称可以被重载。无论是否使用它,当在某些用户不信任其他用户的数据库中调用函数时,此功能都需要安全预防措施;请参阅第 10.3 节。执行查询时,服务器将根据提供的数据类型和参数数量来确定要调用的函数。重载也可以用于模拟具有可变数量参数的函数,直到有限的最大数量。
在创建重载函数系列时,应注意不要造成歧义。例如,给定函数
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
对于一些简单的输入(如 test(1, 1.5)
),立即清楚地知道应该调用哪个函数。当前实现的解析规则在第 10 章中描述,但是设计一个微妙地依赖此行为的系统是不明智的。
接受复合类型的单个参数的函数通常不应与该类型的任何属性(字段)同名。回想一下,
被认为是等效于 属性
(表
)
。如果复合类型上的函数与复合类型的属性之间存在歧义,则始终使用该属性。可以通过模式限定函数名称(即,表
.属性
)来覆盖该选择,但最好通过不选择冲突的名称来避免该问题。模式
.函数
(表
)
另一个可能的冲突是在可变参数和非可变参数函数之间。例如,可以创建 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 函数的名称反映了许多可能的约定之一。
如果您在文档中看到任何不正确的内容、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。