Postgresql 中文操作指南

43.1. Overview #

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

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

在 PostgreSQL 9.0 及更高版本中,PL/pgSQL 默认安装。然而它仍然是一个可加载模块,因此尤其注重安全性的管理员可以选择将其移除。

43.1.1. Advantages of Using PL/pgSQL #

SQL 是 PostgreSQL 和大多数其他关系数据库用作查询语言的语言。它具有可移植性和易学性。但每一句 SQL 语句都必须由数据库服务器单独执行。

这意味着您的客户端应用程序必须将每个查询发送到数据库服务器,等待它被处理,接收并处理结果,进行一些计算,然后向服务器发送进一步的查询。所有这些都会产生进程间通信,如果您的客户端在与数据库服务器不同的机器上,它还将产生网络开销。

使用 PL/pgSQL,您可以将一个计算块和一系列查询 inside 数据库服务器分组,从而既拥有过程语言的强大功能,又拥有 SQL 的易用性,但大大节省了客户端/服务器通信开销。

与不使用存储函数的应用程序相比,这可能会显著提高性能。

此外,使用 PL/pgSQL,您可以使用 SQL 的所有数据类型、运算符和函数。

43.1.2. Supported Argument and Result Data Types #

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

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

还可以声明 PL/pgSQL 函数以接受和返回 Section 38.2.5 中描述的多态类型,从而允许函数处理的实际数据类型在每次调用时发生变化。示例出现在 Section 43.3.1 中。

PL/pgSQL 函数也可以声明用于返回任意数据类型的“集”(或表),该数据类型可以作为单个实例返回。此类函数通过针对结果集的每个所需元素执行 RETURN NEXT 或使用 RETURN QUERY 来输出查询评估结果从而生成其输出。

最后,如果 PL/pgSQL 函数没有任何有用的返回值,则可以声明该函数返回 void 。(也可以在这种情况下将其写为过程。)

还可以声明具有输出参数的 PL/pgSQL 函数,以取代返回类型的明确规范。这不会为该语言添加任何基本功能,但通常很方便,特别是用于返回多个值。也可以在 RETURNS TABLE 中使用 RETURNS SETOF 标记法。

具体示例出现在 Section 43.3.1Section 43.6.1 中。