PL/pgSQL 是 PostgreSQL 数据库系统的一个可加载过程语言。设计 PL/pgSQL 的目标是创建一种可加载过程语言,以便于
创建函数、过程和触发器,
向SQL语言添加控制结构,
执行复杂计算,
继承所有用户定义类型、函数、过程和操作符,
可定义为由服务器信任,
易于使用。
使用 PL/pgSQL 创建的函数可以在所有可以使用内置函数的地方使用。例如,可以创建复杂的条件计算函数,然后将其用于定义操作符或在索引表达式中使用。
在 PostgreSQL 9.0 及更高版本中,PL/pgSQL 默认安装。然而,它仍然是一个可加载模块,因此尤其注重安全性的管理员可以选择将其移除。
SQL是 PostgreSQL 和大多数其他关系型数据库用作查询语言的语言。它可移植且易于学习。但每个SQL语句必须由数据库服务器单独执行。
这意味着你的客户端应用程序必须向数据库服务器发送每个查询,等待其被处理、接收并处理结果、进行一些计算,然后向服务器发送更多查询。所有这些都需要进程间通信,并且如果你的客户端与数据库服务器位于不同的机器上,还会产生网络开销。
使用 PL/pgSQL,你可以将一个计算块和一系列查询组合在数据库服务器内部,从而具有过程语言的强大功能和 SQL 的易用性,但可以大幅节省客户端/服务器通信开销。
消除了客户端和服务器之间的额外往返
客户端不需要的中间结果不必在服务器和客户端之间编组或传输
可以避免多次查询解析
与不使用存储函数的应用程序相比,这可以大大提高性能。
此外,使用 PL/pgSQL,你可以使用所有 SQL 数据类型、操作符和函数。
PL/pgSQL 中编写的函数可接受服务器支持的任何标量或数组数据类型作为参数,并可返回任何这些类型的结果。它们还可以接受或返回由名称指定的所有复合类型(行类型)。也可以将 PL/pgSQL 函数声明为接受 record
,这意味着所有复合类型都可以作为输入,或是声明为返回 record
,这意味着结果是行类型,其列由调用查询中的规范确定,如 第 7.2.1.4 节 所述。
PL/pgSQL 函数可通过使用 VARIADIC
标记声明为接受可变数量的参数。这与 SQL 函数的工作方式完全相同,如 第 36.5.6 节 所述。
PL/pgSQL 函数还可以声明为接受并返回 第 36.2.5 节 中描述的多态类型,从而允许函数处理的实际数据类型随调用而变化。示例出现在 第 41.3.1 节 中。
PL/pgSQL 函数还可以声明为返回任何可作为单个实例返回的数据类型的 “集合”(或表)。此类函数通过为结果集的每个所需元素执行 RETURN NEXT
或通过使用 RETURN QUERY
输出评估查询的结果来生成其输出。
最后,如果 PL/pgSQL 函数没有有用的返回值,则可以声明为返回 void
。(或者,在这种情况下,可以将其写为过程。)
PL/pgSQL 函数还可以声明为使用输出参数替换显式返回类型规范。这不会给语言添加任何基本功能,但通常会很方便,特别是对于返回多个值的情况。也可以使用 RETURNS TABLE
符号代替 RETURNS SETOF
。
具体示例出现在 第 41.3.1 节 和 第 41.6.1 节 中。