8.19. 伪类型

PostgreSQL类型系统包含一系列特殊用途的条目, 它们按照类别来说叫做伪类型。伪类型不能作为字段的数据类型, 但是它可以用于声明一个函数的参数或者结果类型。 伪类型在一个函数不只是简单地接受并返回某种SQL 数据类型的情况下很有用。表 8-24列出了所有的伪类型。

表 8-24. 伪类型

名字描述
any表示一个函数接受任何输入数据类型。
anyelement表示一个函数接受任何数据类型 (参阅第 35.2.5 节)。
anyarray表示一个函数接受任意数组数据类型 (参阅第 35.2.5 节)。
anynonarray表示一个函数接受任意非数组数据类型 (参阅第 35.2.5 节)。
anyenum表示一个函数接受任意枚举数据类型 (参阅第 35.2.5 节第 8.7 节)。
anyrange表示一个函数接受任意范围数据类型 (参阅 第 35.2.5 节第 8.17 节)。
cstring表示一个函数接受或者返回一个空结尾的 C 字符串。
internal表示一个函数接受或者返回一种服务器内部的数据类型。
language_handler一个过程语言调用处理器声明为返回language_handler
fdw_handler一个外部数据封装器声明为返回fdw_handler
record标识一个函数返回一个未声明的行类型。
trigger一个触发器函数声明为返回trigger
void表示一个函数不返回数值。
opaque一个已经过时的类型,以前用于所有上面这些用途。

用 C 编写的函数(不管是内置的还是动态装载的)都可以声明为接受或者返回这样的伪数据类型。 在把伪类型用做函数参数类型的时候,保证函数行为正常就是函数作者的任务了。

用过程语言编写的函数只能根据它们的实现语言是否可以使用伪类型而使用它。 目前,过程语言都不允许使用伪类型作为参数类型,并且只允许使用voidrecord作为结果类型(如果函数用做触发器,那么加上trigger)。 一些多态的函数还支持使用anyelementanyarrayanynonarray anyenumanyrange类型。

伪类型internal用于声明那种只能在数据库系统内部调用的函数, 它们不能直接在SQL查询里调用。如果函数至少有一个 internal类型的参数,那么我们就不能从SQL 里调用它。为了保留这个限制的类型安全,我们一定要遵循这样的编码规则: 不要创建任何声明为返回internal的函数, 除非它至少有一个internal参数。