选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.4 已于 2020 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

第 40 章 PL/pgSQLSQL 过程语言

40.1. 概述 #

PL/pgSQL 是一种用于 PostgreSQL 数据库系统的可载入过程语言。PL/pgSQL 的设计目标,是创建一种具备以下特性的可载入过程语言:

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

  • SQL语言增加控制结构,

  • 可以执行复杂计算,

  • 继承所有用户定义的类型、函数和操作符,

  • 可定义为受服务器信任的语言,

  • 便于使用。

PL/pgSQL 创建的函数,可以用于任何可以使用内置函数的地方。例如,可以创建带有复杂条件逻辑的计算函数,随后用它们定义操作符,或者把它们用于索引表达式。

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

40.1.1. 使用PL/pgSQL的优点 #

SQLPostgreSQL 以及大多数其他关系数据库使用的查询语言。它具有可移植性,也容易学习。但每条 SQL 语句都必须由数据库服务器单独执行。

这意味着客户端应用必须把每个查询发送给数据库服务器,等待其处理完成,接收并处理结果,做一些计算,然后再向服务器发送更多查询。这一切都会产生进程间通信开销;如果客户端与数据库服务器不在同一台机器上,还会额外产生网络开销。

借助 PL/pgSQL,你可以把一段计算逻辑和一系列查询放在数据库服务器内部执行。这样既具备了过程语言的能力,也保留了 SQL 的易用性,同时还能显著减少客户端/服务器通信开销。

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

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

  • 可以避免多轮查询解析

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

此外,通过 PL/pgSQL 你可以使用 SQL 的全部数据类型、操作符和函数。

40.1.2. 支持的参数和结果数据类型 #

PL/pgSQL 编写的函数,可以接受服务器支持的任意标量或数组数据类型作为参数,也可以返回这些类型中的任意一种。它们还可以接受或返回任何按名称指定的复合类型(行类型)。也可以把 PL/pgSQL 函数声明为返回 record,这表示结果是一种行类型,其列由调用查询中的指定内容决定,如 第 7.2.1.4 节 所述。

PL/pgSQL 函数还可以通过使用 VARIADIC 标记声明为接受可变数量的参数。这与 SQL 函数中的行为完全相同,详见 第 35.4.5 节

PL/pgSQL函数也可以声明为接受和返回多态类型anyelementanyarrayanynonarrayanyenumanyrange。多态函数处理的实际数据类型可以在不同调用之间变化,如第 35.2.5 节所述。示例见第 40.3.1 节

PL/pgSQL 函数还可以声明为返回任意可单独返回的数据类型的集合(或表)。这类函数可以通过对结果集中的每个目标元素执行 RETURN NEXT 生成输出,也可以通过 RETURN QUERY 输出某个查询的结果。

最后,如果某个 PL/pgSQL 函数没有有意义的返回值,可以将其声明为返回 void

PL/pgSQL 函数也可以声明为使用输出参数,而不是显式指定返回类型。这并没有为该语言增加新的基本能力,但通常会更方便,尤其是在需要返回多个值时。RETURNS TABLE 记法也可以用来代替 RETURNS SETOF

具体示例见 第 40.3.1 节第 40.6.1 节

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。