pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
可以用同一个名称定义多个函数,只要它们接受的参数不同即可。换句话说,函数名可以被重载。 函数也可以与属性同名。当复合类型上的函数与该复合类型的属性存在歧义时,总是使用属性。
从 Postgres v7.0 开始,SQL CREATE FUNCTION 命令的 AS 子句的另一种形式可以把 SQL 函数名与 C 源代码中的函数名解耦。这现在是实现函数重载的首选技术。
对用 C 编写的函数,CREATE FUNCTION 中声明的 SQL 名称必须与 C 代码中函数的实际名称完全相同(因此它必须是合法的 C 函数名)。
这一限制有一个微妙的含义:虽然大多数操作系统的动态装载例程都乐于让你装载任意数量包含冲突(同名)函数名的共享库,但它们实际上可能以各种有趣的方式把装载搞砸。例如,如果你定义的动态装载函数恰好与 Postgres 内置函数同名,DEC OSF/1 的动态装载器会使 Postgres 调用其自身的函数,而不是让 Postgres 调用你的函数。因此,如果你希望你的函数能在不同体系结构上使用,我们建议不要重载 C 函数名。
有一个巧妙的技巧可以绕过刚才描述的问题。由于重载 SQL 函数没有问题,你可以先定义一组名称不同的 C 函数,然后定义一组同名的 SQL 函数包装器,它们接受适当的参数类型并调用相匹配的 C 函数。
另一种解决方案是不用动态装载,而是把你的函数静态链接到后端并声明为 INTERNAL 函数。此时这些函数的 C 名称必须各不相同,但可以用相同的 SQL 名称声明(当然,只要它们的参数类型不同)。这种方式避免了 SQL 包装函数的开销,代价是准备定制的后端可执行文件要花费更多精力。(此选项只在 6.5 及之后的版本中可用,因为更早的版本要求内部函数在 SQL 中的名称与 C 代码中的相同。)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。