Chapter 23. 过程语言

Postgres 允许用户增加新的编程语言, 并且可以用这些语言写函数和过程.这些语言叫 过程语言(PL).如果我们用一种过程语言 书写了一个函数或者触发器,那么数据库服务器是没有任何内建的 知识获知如何解析该函数的源文本的.实际上这些任务都传递给一个 知道如何处理这些细节的句柄处理.这个句柄既可以自己干所有的 分析,语法分析,执行等的工作,也可以充当Postgres 和一种现有的编程语言实现之间的“胶水”.句柄本身是 一个特殊的编程语言函数,它被编译成一种共享对象并且在需要的时候 装载.

为一种新的过程语言(PL)书写一个句柄的论题超出本手册范围, 不过在 CREATE LANGUAGE 的参考手册里有一些信息.有几种过程语言 可以在标准的 Postgres 版本里获取.

23.1. 安装过程语言

如果你要使用某种过程语言,那么你必须把它“安装” 到要用它的数据库里.不过那些安装到 template1 数据库里的过程语言 会自动在随后创建的数据库中安装.因此数据库管理员可以决定哪个 数据库可以使用哪门语言,以及可以决定缺省时可以使用哪些语言.

对于那些随着标准版本发布的语言,你可以使用 createlang shell 脚本而不用自己事无巨细地 自己做.比如,要安装 PL/pgSQL 到 template1 数据库中,使用

createlang plpgsql template1
下面描述的收工安装的方法只是适用于那些 createlang 还不知道的客户语言.

手工的过程语言安装

一个过程语言是按三个步骤安装到数据库里面去的, 这些任务必须由数据库超级用户执行.

  1. 我们必须被编译和安装该语言句柄的共享对象(目标)必须 安装到一个合适的库目录.这里用的方法和制作安装用户定义的 C 函数的方法是一样的.见 Section 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 语言的句柄是制作和安装到 “library” 目录里面 去的.如果你配置了 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'的函数,或触发器过程被调用的时候使用.