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 函数的工作方式完全相同,如 第 38.5.6 节 中所述。
PL/pgSQL 函数还可以声明为接受并返回 第 38.2.5 节 中描述的多态类型,从而允许函数处理的实际数据类型在每次调用时发生变化。示例出现在 第 43.3.1 节 中。
PL/pgSQL 函数还可以声明为返回任何可作为单个实例返回的数据类型的 “集合”(或表)。此类函数通过对结果集的每个所需元素执行 RETURN NEXT
或使用 RETURN QUERY
输出查询评估结果来生成其输出。
最后,如果 PL/pgSQL 函数没有有用的返回值,则可以声明为返回 void
。(或者,在这种情况下,可以将其编写为一个过程。)
PL/pgSQL 函数还可以使用输出参数声明,而不是显式指定返回类型。这不会为语言添加任何基本功能,但通常很方便,尤其是在返回多个值时。RETURNS TABLE
表示法也可以代替 RETURNS SETOF
使用。
具体示例出现在 第 43.3.1 节 和 第 43.6.1 节 中。