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

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 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 8.2 已于 2011 年 12 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 36 章 过程语言

PostgreSQL允许使用 SQL 和 C 之外的其他语言 编写用户定义的函数。这些语言统称为过程语言 (PL)。对于用过程语言编写的函数,数据库服务器 并不内置关于如何解释函数源文本的知识。相反,这项任务会交给一个了解该 语言细节的专门的调用处理器。该调用处理器既可以自行完成解析、语法分析、 执行等全部工作,也可以在PostgreSQL与某种 现有编程语言实现之间充当“粘合剂”。与其他任何 C 函数一样, 调用处理器本身也是一个被编译进共享对象并按需装载的 C 语言函数。

标准PostgreSQL发行版当前提供四种过程语言: PL/pgSQL(第 37 章)、 PL/Tcl(第 38 章)、 PL/Perl(第 39 章)以及 PL/Python(第 40 章)。 另有一些可用的过程语言并未包含在核心发行版中。 附录 H提供了查找它们的信息。此外,用户还可 以自行定义其他语言;开发新过程语言的基础知识见 第 47 章。

36.1. 安装过程语言 #

过程语言必须在每个要使用它的数据库中“安装”。不过,安装在 数据库template1中的过程语言会自动在随后创建的所有 数据库中可用,因为它们在template1中的条目会由 CREATE DATABASE复制。因此,数据库管理员可以决定哪 些数据库提供哪些语言,并且如果愿意,也可以让某些语言默认可用。

对于标准发行版自带的语言,只需执行 CREATE LANGUAGE language_name,即可将该语言安装到当前数据库中。 此外,也可以从 shell 命令行使用程序 createlang 来完成这项工作。例如,要把语言 PL/pgSQL 安装到数据库 template1,可以使用

createlang plpgsql template1

下文所述的手工过程只建议用于安装 CREATE LANGUAGE 不认识的自定义语言。

手工安装过程语言

在数据库中安装过程语言需要四个步骤,且必须由数据库超级用户 执行。(对于 CREATE LANGUAGE 已认识的语言,可以 省略第二和第三步,因为如有需要,这些步骤会自动执行。)

  1. 该语言调用处理器的共享对象必须先编译好并安装到合适的库目录中。这与 构建和安装含有普通用户定义 C 函数的模块的方法相同;见 第 33.9.6 节。该语言调用处理器往往还会依赖一个提供实际编 程语言引擎的外部库;如果是这样,该库也必须安装。

  2. 必须用如下命令声明该调用处理器:

    CREATE FUNCTION handler_function_name()
        RETURNS language_handler
        AS 'path-to-shared-object'
        LANGUAGE C;
    

    特殊返回类型language_handler会告诉数据库系统,该函数返 回的不是某种已定义的SQL数据类型,并且不能在 SQL语句中直接使用。

  3. 可选地,语言调用处理器可以提供一个“验证器”函数, 用于在不实际执行的情况下检查函数定义是否正确。如果存在验证器 函数,CREATE FUNCTION 就会调用它。如果该语言提供了 验证器函数,可用类似下面的命令声明它:

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    
  4. 该 PL 必须用如下命令声明:

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE language-name
        HANDLER handler_function_name
        [VALIDATOR validator_function_name] ;
    

    可选关键字 TRUSTED 指定允许没有超级用户权限的 普通数据库用户使用该语言创建函数和触发器过程。由于 PL 函数是在 数据库服务器内部执行的, TRUSTED 标记只应赋予那些不允许访问数据库 服务器内部或文件系统的语言。语言 PL/pgSQL、 PL/Tcl 和 PL/Perl 被认为是受信任的;而语言 PL/TclU、 PL/PerlU 和 PL/PythonU 旨在提供无限制的功能,因此不应被标记为 受信任的。

例 36.1展示了以 PL/pgSQL为例时,手工安装过程是如何进行的。

例 36.1. 手工安装 PL/pgSQL

下面的命令告诉数据库服务器到哪里查找 PL/pgSQL语言调用处理器函数的共享对象:

CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS
    '$libdir/plpgsql' LANGUAGE C;

PL/pgSQL 具有验证器 函数,因此我们也声明它:

CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS
    '$libdir/plpgsql' LANGUAGE C;

下面的命令

CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
    HANDLER plpgsql_call_handler
    VALIDATOR plpgsql_validator;

随后指定应为以下函数和触发器过程调用前面声明的函数:其语言属性为plpgsql。


在默认的PostgreSQL安装中, PL/pgSQL语言的调用处理器会被构建并安装到 “库”目录中。如果在构建时配置了Tcl支持,那么 PL/Tcl和PL/TclU 的调用处理器会被构建并安装到该库目录中。同样,如果在构建时配置了 Perl 支持,就会构建并安装 PL/Perl和PL/PerlU 的调用处理器;如果在构建时配置了 Python 支持,则会安装 PL/PythonU的调用处理器。

提交更正

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