返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

33.5. 函数重载

发布于 2019-09-30 03:09:09 字数 1108 浏览 931 评论 0 收藏 0

多个函数可以定义成同样的 SQL 名字,只要它们接受的参数不同。换句话说,函数名可以重载。在执行一个查询的时候,服务器会从提供的参数类型和个数上判断应该调用哪个函数。重载也可以用于模拟数目不定(有上限)的参数。

在创建一族重载函数的时候,我们应该小心避免歧义。比如,对于下面的函数

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

如果给出一些简单的输入,比如 test(1, 1.5) ,系统要想判断应该调用哪个函数可不是一件很容易的事情。目前实现的解析规则在章10里描述,但是设计一个隐含依赖这些行为的系统是不明智的。

一个接受单个复合类型参数的函数通常不应该和该类型或该类型的任何属性(字段)同名。attribute(table) 被认为等效于 table.attribute 。在这种情况下,一个复合类型上的函数会和一个复合类型的属性有歧义(总是使用属性)。我们可以通过使用模式来修饰函数名(也就是 schema.func(table))以绕开这个限制,但最好还是通过使用无冲突的名字来避免这个问题。

在重载 C 语言函数的时候,还有一个额外的限制:重载族的每个函数的 C 名字必须和所有其它函数的 C 名字不同,其它函数包括内部的和动态加载的。如果违反这条规则,那么行为是不可移植的。你可能会得到一个运行时的链接错误,或者是其中一个函数被调用(通常是内部的那个)。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 函数名代表许多可能的惯例之一。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文