# 43.1.概述
PL/pgSQL是PostgreSQL数据库系统的可加载过程语言。PL/pgSQL的设计目标是创建一种可加载的过程语言
可用于创建函数、过程和触发器,
将控制结构添加到SQL语言中,
能够进行复杂的计算,
继承所有用户定义的类型、函数、过程和运算符,
可以定义为受服务器信任,
很容易使用。
使用PL/pgSQL创建的函数可以在任何可以使用内置函数的地方使用。例如,可以创建复杂的条件计算函数,然后使用它们定义运算符或在索引表达式中使用它们。
在PostgreSQL 9.0及更高版本中,默认情况下安装PL/pgSQL。然而,它仍然是一个可加载的模块,因此特别是有安全意识的管理员可以选择删除它。
# 43.1.1.使用PL/pgSQL的优点
SQL是PostgreSQL和大多数其他关系数据库用作查询语言的语言。它便于携带和学习。但每个SQL语句都必须由数据库服务器单独执行。
这意味着您的客户机应用程序必须将每个查询发送到数据库服务器,等待处理,接收并处理结果,进行一些计算,然后将进一步的查询发送到服务器。所有这些都会导致进程间通信,并且如果您的客户机与数据库服务器位于不同的机器上,也会导致网络开销。
使用PL/pgSQL,您可以对计算块和一系列查询进行分组在…内数据库服务器,因此具有过程语言的强大功能和SQL的易用性,但大大节省了客户机/服务器通信开销。
消除了客户端和服务器之间的额外往返
客户端不需要的中间结果不必在服务器和客户端之间封送或传输
可以避免多轮查询解析
与不使用存储函数的应用程序相比,这可能会导致性能显著提高。
此外,通过PL/pgSQL,您可以使用SQL的所有数据类型、运算符和函数。
# 43.1.2.支持的参数和结果数据类型
用PL/pgSQL编写的函数可以接受服务器支持的任何标量或数组数据类型作为参数,并且可以返回这些类型的结果。它们还可以接受或返回由名称指定的任何组合类型(行类型)。也可以将PL/pgSQL函数声明为接受记录
,这意味着任何复合类型都将作为输入或返回记录
,这意味着结果是一种行类型,其列由调用查询中的规范确定,如中所述第7.2.1.4节.
PL/pgSQL函数可以通过使用可变的
标记。这与SQL函数的工作方式完全相同,如中所述第38.5.6节.
PL/pgSQL函数也可以声明为接受和返回中描述的多态类型第38.2.5节,从而允许函数处理的实际数据类型因调用而异。例子见第43.3.1节.
PL/pgSQL函数还可以声明为返回任何数据类型的“集”(或表),这些数据类型可以作为单个实例返回。这样的函数通过执行下一个回来
对于结果集的每个所需元素,或使用返回查询
以输出计算查询的结果。
最后,可以声明PL/pgSQL函数以返回无效的
如果它没有有用的返回值。(或者,在这种情况下,可以将其编写为一个过程。)
PL/pgSQL函数也可以用输出参数来声明,以代替返回类型的显式规范。这并没有为语言添加任何基本功能,但通常很方便,尤其是在返回多个值时。这个返回表
符号也可以用来代替返回集合
.