2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 节 中。

提交更正

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