【PostgreSQL】从零开始:(三十六)数据类型-伪类型

2023-12-29 07:36:29

伪类型

伪类型是指在编程语言中使用的一种类型名称,用来表示某个值可能具有的多种类型之一。伪类型通常不是真正的数据类型,而是一种抽象概念,用来描述编程逻辑中的类型关系。在一些静态类型语言中,伪类型可以作为某个变量的类型注解,用来表示该变量可以接受不同的类型值。伪类型的使用可以增加代码的灵活性,但也可能引入类型安全方面的问题。

PostgreSQL伪类型

在PostgreSQL中,伪类型是一组特殊的数据类型,用于表示与数据库相关的特定信息。这些伪类型不能用于声明表的列或函数的参数,但可以用于查询、视图和函数的返回类型。

以下是一些常见的PostgreSQL伪类型:

  1. REFCURSOR:用于返回一个游标,它可以被用作动态查询的结果集。
  2. VOID:用于表示没有返回值的函数。
  3. TRIGGER:用于表示触发器函数的参数类型。
  4. ANYARRAY和ANYELEMENT:用于表示未知数组或元素类型的参数。
  5. RECORD:用于表示未知结构的数据类型。
    ANY:用于表示未知数据类型的参数。

这些伪类型在特定情况下非常有用,可以让开发人员更灵活地处理不确定的数据类型或结果集。

PostgreSQL 类型系统包含许多特殊用途的条目,这些条目统称为伪类型。伪类型不能用作列数据类型,但可用于声明函数的参数或结果类型。在函数的行为与简单地获取或返回特定 SQL 数据类型的值不对应的情况下,每个可用的伪类型都很有用。

伪类型表

名字描述
any指示函数接受任何输入数据类型。
anyelement指示函数接受任何数据类型。
anyarray指示函数接受任何数组数据类型。
anynonarray指示函数接受任何非数组数据类型。
anyenum指示函数接受任何枚举数据类型。
anyrange指示函数接受任何范围数据类型。
anymultirange指示函数接受任何多范围数据类型。
anycompatible指示函数接受任何数据类型,并自动将多个参数提升为通用数据类型。
anycompatiblearray指示函数接受任何数组数据类型,并自动将多个参数提升为通用数据类型。
anycompatiblenonarray指示函数接受任何非数组数据类型,并自动将多个参数提升为通用数据类型。
anycompatiblerange指示函数接受任何范围数据类型,并自动将多个参数提升为通用数据类型。
anycompatiblemultirange指示函数接受任何多范围数据类型,并自动将多个参数提升为通用数据类。
cstring指示函数接受或返回以 null 结尾的 C 字符串。
internal指示函数接受或返回服务器内部数据类型。
language_handler过程语言调用处理程序被声明为返回 。language_handler
fdw_handler声明外部数据包装处理程序返回 。fdw_handler
table_am_handler表访问方法处理程序被声明为返回 。table_am_handler
index_am_handler索引访问方法处理程序声明为返回 。index_am_handler
tsm_handler声明 tablesample 方法处理程序将返回 。tsm_handler
record标识接受或返回未指定行类型的函数。
trigger声明触发器函数返回trigger.
event_trigger声明事件触发器函数返回event_trigger.
pg_ddl_command标识可用于事件触发器的 DDL 命令的表示形式。
void指示函数不返回任何值。
unknown标识尚未解析的类型,例如,未修饰的字符串文本。

用 C 编码的函数(无论是内置的还是动态加载的)可以声明为接受或返回这些伪类型中的任何一个。函数作者有责任确保在将伪类型用作参数类型时函数的行为安全。

用过程语言编码的函数只能在其实现语言允许的情况下使用伪类型。目前,大多数过程语言禁止使用伪类型作为参数类型,只允许将伪类型用作结果类型(加号或当函数用作触发器或事件触发器时)。有些还支持使用多态伪类型的多态函数。

伪类型用于声明仅供数据库系统内部调用的函数,而不是通过 SQL 查询中的直接调用调用的函数。如果一个函数至少有一个 -type 参数,则不能从 SQL 调用它。为了保持此限制的类型安全性,请务必遵循以下编码规则:不要创建任何声明为返回的函数,除非它至少有一个参数。

文章来源:https://blog.csdn.net/sinat_36528886/article/details/135231431
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。