支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

41.1. 概述 #

PL/pgSQLPostgreSQL 数据库系统的可加载过程语言。PL/pgSQL 的设计目标是创建一个可加载的过程语言,该语言:

  • 可用于创建函数、过程和触发器,

  • SQL语言添加控制结构,

  • 可以执行复杂的计算,

  • 继承所有用户定义的类型、函数、过程和运算符,

  • 可以被定义为受服务器信任,

  • 易于使用。

使用 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 函数声明为接受 record,这意味着任何复合类型都将作为输入,或者声明为返回 record,这意味着结果是一个行类型,其列由调用查询中的规范确定,如第 7.2.1.4 节中所述。

PL/pgSQL 函数可以使用 VARIADIC 标记声明为接受可变数量的参数。这与 SQL 函数的工作方式完全相同,如第 36.5.6 节中所述。

PL/pgSQL 函数还可以声明为接受和返回第 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 节中。

提交更正

如果您在文档中看到任何不正确、与您在特定功能方面的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。