42.1. Overview

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

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

  • 向 SQL 语言添加控制结构,

  • 可以执行复杂的计算,

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

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

  • 易于使用。

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

在 PostgreSQL 9.0 和更高版本中,默认情况下安装 PL/pgSQL。但是,它仍然是可加载的模块,因此,特别是安全意识强的 Management 员可以选择删除它。

42 .1.1. 使用 PL/pgSQL 的优点

SQL 是 PostgreSQL 和大多数其他关系数据库用作查询语言的语言。它是便携式的,易于学习。但是每个 SQL 语句必须由数据库服务器单独执行。

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

使用 PL/pgSQL,您可以在数据库服务器内部对计算块和一系列查询进行分组,从而具有过程语言的功能和 SQL 的易用性,但可以节省 Client 端/服务器的通信开销。

  • 消除了 Client 端和服务器之间的额外往返

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

  • 可以避免多轮查询解析

与不使用存储功能的应用程序相比,这可以显着提高性能。

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

42 .1.2. 支持的参数和结果数据类型

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

可以使用VARIADIC标记将 PL/pgSQL 函数声明为接受可变数量的参数。这与Section 37.4.5中讨论的 SQL 函数完全相同。

PL/pgSQL 函数也可以声明为接受并返回anyelementanyarrayanynonarrayanyenumanyrange的多态类型。如Section 37.2.5所述,多态函数处理的实际数据类型可能因调用而异。 Section 42.3.1中显示了一个示例。

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

最后,如果 PL/pgSQL 函数没有有用的返回值,则可以声明它返回void

也可以使用输出参数声明 PL/pgSQL 函数,以代替对返回类型的明确说明。这不会为语言增加任何基本功能,但通常很方便,特别是对于返回多个值。 RETURNS TABLE表示法也可以代替RETURNS SETOF使用。

具体示例出现在Section 42.3.1Section 42.6.1中。