41.1. 综述

PL/pgSQL是一种用于PostgreSQL数据库系统的可载入的过程语言。PL/pgSQL的设计目标是创建一种这样的可载入过程语言

PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方。例如,可以创建复杂条件的计算函数并且后面用它们来定义操作符或把它们用于索引表达式。

PostgreSQL 9.0 和以后的版本中,PL/pgSQL是默认被安装的。但是它仍然是一种可载入模块,因此特别关注安全性的管理员可以选择移除它。

41.1.1. 使用PL/pgSQL的优点

SQLPostgreSQL和大多数其他关系数据库用作查询语言。它是可移植的并且容易学习。但是每一个SQL语句必须由数据库服务器单独执行。

这意味着你的客户端应用必须发送每一个查询到数据库服务器、等待它被处理、接收并处理结果、做一些计算,然后发送更多查询给服务器。如果你的客户端和数据库服务器不在同一台机器上,所有这些会引起进程间通信并且将带来网络负担。

通过PL/pgSQL,你可以将一整块计算和一系列查询分组在数据库服务器内部,这样就有了一种过程语言的能力并且使 SQL 更易用,但是节省了相当多的客户端/服务器通信开销。

与不使用存储函数的应用相比,这能够导致可观的性能提升。

还有,通过PL/pgSQL你可以使用 SQL 中所有的数据类型、操作符和函数。

41.1.2. 支持的参数和结果数据类型

PL/pgSQL编写的函数可以接受服务器支持的任何标量或数组数据类型作为参数,并且它们能够返回任何这些类型的结果。它们也能接受或返回任何用名称指定的组合类型(行类型)。也可以声明一个PL/pgSQL函数为返回记录,这意味着结果是一种行类型,其中的列由调用查询中的说明决定(如第 7.2.1.4 节中所讨论的)。

PL/pgSQL函数可以通过使用VARIADIC标记被声明为接受数量不定的参数。如第 36.4.5 节中所讨论的,它的工作方式和 SQL 函数一样。

PL/pgSQL函数也可以被声明为接受并返回多态类型anyelementanyarrayanynonarrayanyenum以及anyrange。如第 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 节中有详细的例子。