8.20. 伪类型

PostgreSQL类型系统包含了一些特殊目的的项,它们被统称为伪类型。一个伪类型不能被用作一个列的数据类型,但是它可以被用来定义一个函数的参数或者结果类型。每一种可用的伪类型都有其可以发挥作用的情况,这些情况的特点是一个函数的行为并不能符合于简单使用或者返回一种特定SQL数据类型的值。Table 8-25列出了现有的伪类型。

Table 8-25. 伪类型

名字描述
any表示一个函数可以接受任意输入数据类型。
anyelement表示一个函数可以接受任意数据类型(参见Section 35.2.5)。
anyarray表示一个函数可以接受任意数组数据类型(参见Section 35.2.5
anynonarray表示一个函数可以接受任意非数组数据类型(参见Section 35.2.5)。
anyenum表示一个函数可以接受任意枚举数据类型(参见Section 35.2.5Section 8.7)。
anyrange表示一个函数可以接受任意范围数据类型(参见Section 35.2.5Section 8.17)。
cstring表示一个函数接受或者返回一个非空结尾的C字符串。
internal表示一个函数接受或返回一个服务器内部数据类型。
language_handler一个被声明为返回language_handler的过程语言调用处理器。
fdw_handler一个被声明为返回fdw_handler的外部数据包装器处理器。
record标识一个函数返回一个未指定的行类型。
trigger一个被声明为返回trigger的触发器函数。
void表示一个函数不返回值。
opaque一种已被废弃的类型名称,以前它用于实现所有以上的目的。

用C编写的函数(不管是内建的还是动态载入的)可以被声明为接受或返回这些为数据类型的任意一种。函数的作者应当保证当一个伪类型被用作一个参数类型时函数的行为是安全的。

用过程语言编写的函数只有在其实现语言允许的情况下才能使用伪类型。目前所有的过程语言都禁止使用伪类型作为参数类型,并且只允许使用voidrecord作为结果类型(如果函数被用于一个触发器, trigger也被允许作为结果类型)。某些过程语言也支持在多态函数中使用类型anyelementanyarrayanynonarrayanyenumanyrange

internal伪类型用于定义只在数据库系统内部调用的函数,这些函数不会被SQL直接调用。如果一个函数拥有至少一个internal类型的参数,则它不能从SQL中被调用。为了保持这种限制的类型安全性,遵循以下编码规则非常重要:不要创建任何被声明要返回internal的函数,除非它有至少一个internal参数。