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. 概述
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;最早采样版本不一定是实际引入版本。