Table of Contents
PL/pgSQL 是一种用于 PostgreSQL 数据库系统的可载入过程语言。PL/pgSQL 的设计目标,是创建一种具备以下特性的可载入过程语言:
可用于创建函数、过程和触发器,
为SQL语言增加控制结构,
可以执行复杂计算,
继承所有用户定义的类型、函数、过程和操作符,
可定义为受服务器信任的语言,
便于使用。
用 PL/pgSQL 创建的函数,可以用于任何可以使用内置函数的地方。例如,可以创建带有复杂条件逻辑的计算函数,随后用它们定义操作符,或者把它们用于索引表达式。
在 PostgreSQL 9.0 及更高版本中,PL/pgSQL 默认安装。不过它仍然是一个可载入模块,因此对安全性特别敏感的管理员也可以选择移除它。
SQL 是 PostgreSQL 以及大多数其他关系数据库使用的查询语言。它具有可移植性,也容易学习。但每条 SQL 语句都必须由数据库服务器单独执行。
这意味着客户端应用必须把每个查询发送给数据库服务器,等待其处理完成,接收并处理结果,做一些计算,然后再向服务器发送更多查询。这一切都会产生进程间通信开销;如果客户端与数据库服务器不在同一台机器上,还会额外产生网络开销。
借助 PL/pgSQL,你可以把一段计算逻辑和一系列查询放在数据库服务器内部执行。这样既具备了过程语言的能力,也保留了 SQL 的易用性,同时还能显著减少客户端/服务器通信开销。
消除了客户端和服务器之间额外的往返通信
客户端不需要的中间结果不必在服务器与客户端之间编组或传输
可以避免多轮查询解析
与不使用存储函数的应用相比,这可能带来相当可观的性能提升。
此外,通过 PL/pgSQL 你可以使用 SQL 的全部数据类型、操作符和函数。
用 PL/pgSQL 编写的函数,可以接受服务器支持的任意标量或数组数据类型作为参数,也可以返回这些类型中的任意一种。它们还可以接受或返回任何按名称指定的复合类型(行类型)。也可以把 PL/pgSQL 函数声明为接受 record,这表示任意复合类型都可作为输入;或者声明为返回 record,这表示结果是一种行类型,其列由调用查询中的指定内容决定,如 Section 7.2.1.4 所述。
PL/pgSQL 函数还可以通过使用 VARIADIC 标记声明为接受可变数量的参数。这与 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。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。