↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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

百科 / 过程语言 / “ 外层块 ”

plpgsql

PL/pgSQL 过程语言

当前查看 PostgreSQL 18.6。

说明

PL/pgSQL 过程语言

种类
随源码提供的过程语言变体
操作符家族
“ 外层块 ”
可信
t
处理函数
plpgsql_call_handler
内联代码处理函数
plpgsql_inline_handler
校验函数
plpgsql_validator
库
$libdir/plpgsql
默认版本
1.0
模块路径
$libdir/plpgsql
注释
PL/pgSQL 过程语言

同构建源码中的安装定义

此扩展随源码提供;收录它并不表示已安装该语言或外部运行时。

/* src/pl/plpgsql/src/plpgsql--1.0.sql */

CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler
  LANGUAGE c AS 'MODULE_PATHNAME';

CREATE FUNCTION plpgsql_inline_handler(internal) RETURNS void
  STRICT LANGUAGE c AS 'MODULE_PATHNAME';

CREATE FUNCTION plpgsql_validator(oid) RETURNS void
  STRICT LANGUAGE c AS 'MODULE_PATHNAME';

CREATE TRUSTED LANGUAGE plpgsql
  HANDLER plpgsql_call_handler
  INLINE plpgsql_inline_handler
  VALIDATOR plpgsql_validator;

-- The language object, but not the functions, can be owned by a non-superuser.
ALTER LANGUAGE plpgsql OWNER TO @extowner@;

COMMENT ON LANGUAGE plpgsql IS 'PL/pgSQL procedural language';

手册定义

41.1. 概述

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

  • 可用于创建函数、过程和触发器,
  • 为 SQL 语言增加控制结构,
  • 可以执行复杂计算,
  • 继承所有用户定义的类型、函数、过程和运算符,
  • 可以定义为受服务器信任的语言,
  • 易于使用。

PL/pgSQL 创建的函数可用于任何允许使用内置函数的地方。例如,可以创建包含复杂条件计算的函数,再用它定义运算符或用于索引表达式。

从 PostgreSQL 9.0 开始,PL/pgSQL 默认安装。不过,它仍然是可加载模块,因此特别注重安全的管理员可以选择移除它。

PostgreSQL 和大多数其他关系数据库使用 SQL 作为查询语言。它可移植且易于学习,但每条 SQL 语句都必须由数据库服务器单独执行。

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

使用 PL/pgSQL 可以将一组计算和一系列查询放在数据库服务器内部执行,兼具过程语言的能力与 SQL 的易用性,同时显著减少客户端/服务器通信开销。

  • 消除客户端与服务器之间额外的往返通信。
  • 客户端不需要的中间结果无需封送,也无需在服务器与客户端之间传输。
  • 可以避免多轮查询解析。

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

此外,在 PL/pgSQL 中可以使用 SQL 的全部数据类型、运算符和函数。

PL/pgSQL 函数可以接受服务器支持的任意标量或数组类型参数,并返回这些类型的结果,也可以接受或返回按名称指定的任意复合类型(行类型)。还可以将函数声明为接受 record,表示任意复合类型都可作为输入;或声明为返回 record,表示结果是行类型,其列由调用查询中的声明确定,详见第 7.2.1.4 节。

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

PL/pgSQL 函数也可以声明为接受和返回第 36.2.5 节中描述的多态类型,从而允许函数处理的实际数据类型在不同调用之间变化。示例见第 41.3.1 节。

对于能够返回单个实例的任意数据类型,PL/pgSQL 函数也可声明为返回该类型的“集合”(或表)。此类函数通过为结果集的每个元素执行 RETURN NEXT,或通过 RETURN QUERY 输出查询求值结果来生成输出。

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

PL/pgSQL 函数也可用输出参数声明代替显式指定返回类型。这没有为语言增加根本性能力,但通常很方便,尤其是在返回多个值时。也可用 RETURNS TABLE 记法代替 RETURNS SETOF。

具体示例见第 41.3.1 节和第 41.6.1 节。

相关条目

文档与源码

来源构建
版本
18.6
构建
https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 17 → 18: 无变化。

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

导出 JSON · 返回过程语言 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。