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

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 7.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 23 章 过程语言

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

编写新过程语言的调用处理器超出了本手册的范围,不过 CREATE LANGUAGE 参考页中提供了一些相关信息。标准 Postgres 发行版提供了几种过程语言。

23.1. 安装过程语言 #

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

对于标准发行版自带的语言,可以使用 shell 脚本 createlang 来代替手工完成各个细节。例 如,要把 PL/pgSQL 安装到 template1 数据库,可以使用

createlang plpgsql template1

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

手工安装过程语言

在数据库中安装过程语言需要三个 步骤,且必须由数据库超级用户执行。

  1. 该语言调用处理器的共享对象必须先编译好并安装到合适的库目录中。这与 构建和安装含有普通用户定义 C 函数的模块的方法相同;见 第 13.4.6 节。

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

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

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

  3. 该 PL 必须用如下命令声明:

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE 'language-name'
        HANDLER handler_function_name
        LANCOMPILER 'description';
    

    可选关键字 TRUSTED 指明是否允许没有超级用户 权限的普通数据库用户使用该语言创建函数和触发器过程。由于 PL 函数 是在数据库后端内部执行的,TRUSTED 标记只应赋予那些不允许访问数据库后端 内部或文件系统的语言。语言 PL/pgSQL、 PL/Tcl 和 PL/Perl 已知是受信任的;而语言 PL/TclU 不应被标记为受信任的。

在默认的 Postgres 安装中, PL/pgSQL 语言的调用处理器会被构建并安装到 “库”目录中。如果配置了 Tcl/Tk 支持, PL/Tcl 和 PL/TclU 的调用处理器也会被构建并安装到同一 位置。类似地,如果配置了 Perl 支持,PL/Perl 的调用处理器也会被构建 和安装。createlang 脚本会自动完成上文所述的两个 CREATE 步骤。

示例

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

    CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS
        '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';
    
  2. 而命令

    CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
        HANDLER plpgsql_call_handler
        LANCOMPILER 'PL/pgSQL';
    

    则定义对于语言属性为 'plpgsql' 的函数和触发器过 程,将调用先前声明的调用处理器函数。

提交更正

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