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,这意味着结果是一个行类型,
其列由调用查询中的规定决定,详见
Section 7.2.1.4。
通过使用 VARIADIC 标记,PL/pgSQL
函数可以被声明为接受可变数量的参数。其工作方式与 SQL 函数完全相同,
参见 Section 36.5.6。
PL/pgSQL 函数也可以被声明为接受和返回 Section 36.2.5 中描述的多态类型, 从而允许函数处理的实际数据类型在每次调用时各不相同。 示例见 Section 41.3.1。
PL/pgSQL 函数还可以被声明为返回任何可作为
单个实例返回的数据类型的“集合”(或表)。
这样的函数通过为结果集的每个期望元素执行
RETURN NEXT,或者使用 RETURN QUERY
输出一个查询的求值结果,来产生它的输出。
最后,如果 PL/pgSQL 函数没有有用的返回值,
可以将它声明为返回 void。(在这种情况下,
也可以把它写成一个过程。)
PL/pgSQL 函数也可以用输出参数替代显式的
返回类型说明。这并不会给语言增加任何根本性的新能力,
但通常很方便,尤其是在返回多个值时。
RETURNS TABLE 记法也可以用来替代
RETURNS SETOF。
具体示例见 Section 41.3.1 和 Section 41.6.1。