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中所讨论)。
PL/pgSQL函数可以通过使用VARIADIC
标记被声明为接受数量不定的参数。如Section 38.5.5中所讨论的,它的工作方式和 SQL 函数一样。
PL/pgSQL函数也可以被声明为接受并返回多态类型anyelement
、anyarray
、anynonarray
、anyenum
以及anyrange
。如Section 38.2.5中所讨论的,由一个多态函数处理的实际数据类型会随着调用改变。在Section 43.3.1中展示了一个例子。
PL/pgSQL函数还能够被声明为返回一个任意(可作为一个单一实例返回的)数据类型的“集合”(或表)。这样的一个函数通过为结果集的每个期望元素执行RETURN NEXT
来产生输出,或者通过使用RETURN QUERY
来输出一个查询计算的结果。
最后,如果一个PL/pgSQL函数没有可用的返回值,它可以被声明为返回void
(另外一种选择是,在那种情况下它可以被写作一个过程)。
PL/pgSQL函数也能够被声明为用输出参数代替返回类型的一个显式说明。这没有为该语言增加任何基础功能,但是它常常很方便,特别是对于要返回多个值的情况。RETURNS TABLE
符号也可以被用来替代RETURNS SETOF
。
在Section 43.3.1和Section 43.6.1中有详细的例子。