2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 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/pgSQL 是 PostgreSQL 数据库系统的一个可加载的过程语言。 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 节中。

提交更正

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