PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

41.1. 概述 #

41.1.1. 使用 PL/pgSQL 的优势
41.1.2. 受支持的参数与返回数据类型

PL/pgSQL 是 PostgreSQL 数据库系统的一种可加载过程语言。PL/pgSQL 的设计目标是 创建一种可加载的过程语言,它

使用 PL/pgSQL 创建的函数可以用在内建函数能被使用的 任何地方。例如,可以创建复杂的条件计算函数,然后将它们用于定义操作符, 或在索引表达式中使用它们。

在 PostgreSQL 9.0 及更高版本中, PL/pgSQL 默认会被安装。但它仍然是一个可加载模块, 因此对安全性特别敏感的管理员可以选择将其移除。

41.1.1. 使用 PL/pgSQL 的优势 #

SQL 是 PostgreSQL 以及大多数其他关系型数据库用作查询语言的语言。它可移植且易于学习。 但每条 SQL 语句都必须由数据库服务器逐条执行。

这意味着你的客户端应用必须把每条查询发送给数据库服务器,等待它被处理, 接收并处理结果,做一些计算,然后再向服务器发送后续的查询。 所有这些都会带来进程间通信开销,如果你的客户端与数据库服务器 不在同一台机器上,还会带来网络开销。

使用 PL/pgSQL,你可以把一块计算和一系列查询 分组放在数据库服务器内部执行, 从而兼具过程语言的强大能力和 SQL 的易用性, 并显著节省客户端/服务器之间的通信开销。

  • 客户端与服务器之间额外的往返通信被消除

  • 客户端不需要的中间结果不必在服务器 与客户端之间进行编组或传输

  • 可以避免多轮查询解析

与不使用存储函数的应用相比, 这可以带来相当可观的性能提升。

此外,在 PL/pgSQL 中你可以使用 SQL 的所有 数据类型、操作符和函数。

41.1.2. 受支持的参数与返回数据类型 #

用 PL/pgSQL 编写的函数可以接受服务器支持的任何 标量或数组数据类型作为参数,并且可以返回这些类型中任何一种的结果。 它们还可以接受或返回任何按名称指定的复合类型(行类型)。 也可以把 PL/pgSQL 函数声明为接受 record,这意味着任何复合类型都可作为输入; 或者声明为返回 record,这意味着结果是一个行类型, 其列由调用查询中的规定决定,详见 Section 7.2.1.4。

通过使用 VARIADIC 标记,PL/pgSQL 函数可以被声明为接受可变数量的参数。其工作方式与 SQL 函数完全相同, 参见 Section 36.5.6。

PL/pgSQL 函数也可以被声明为接受和返回 Section 36.2.5 中描述的多态类型, 从而允许函数处理的实际数据类型在每次调用时各不相同。 示例见 Section 41.3.1。

PL/pgSQL 函数还可以被声明为返回任何可作为 单个实例返回的数据类型的“集合”(或表)。 这样的函数通过为结果集的每个期望元素执行 RETURN NEXT,或者使用 RETURN QUERY 输出一个查询的求值结果,来产生它的输出。

最后,如果 PL/pgSQL 函数没有有用的返回值, 可以将它声明为返回 void。(在这种情况下, 也可以把它写成一个过程。)

PL/pgSQL 函数也可以用输出参数替代显式的 返回类型说明。这并不会给语言增加任何根本性的新能力, 但通常很方便,尤其是在返回多个值时。 RETURNS TABLE 记法也可以用来替代 RETURNS SETOF。

具体示例见 Section 41.3.1 和 Section 41.6.1。