Chapter 36. 过程语言

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

为一种新的过程语言(PL)书写一个句柄的论题在 Chapter 47 里描述。 标准的 PostgreSQL 版本里可以直接获得几种过程语言可以直接。

36.1. 安装过程语言

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

对于那些随着标准版本发布的语言,你可以使用 createlang 程序来安装语言而不用自己事无巨细的自己做。 比如,要安装PL/pgSQLtemplate1 数据库中,使用

createlang plpgsql template1

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

手工的过程语言安装

一个过程语言是按三个步骤安装到数据库里面去的, 这些任务必须由数据库超级用户执行。 createlang 程序把 step 2step 3 自动化了。

  1. 我们必须被编译和安装该语言句柄的共享对象(目标)必须安装到一个合适的库目录。 这里用的方法和制作安装用户定义的 C 函数的方法是一样的。见 Section 33.7.6

  2. 句柄必须用下面命令声明

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

    特殊的返回类型 language_handler 告诉数据库系统, 这个函数并不返回一个已定义的 SQL 数据类型并且是不能直接在 SQL 语句里面使用。

  3. PL 必须用下面命令定义

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

    可选的关键字 TRUSTED 声明一个没有超级用户权限的普通数据库用户能否使用这种语言创建函数和触发器过程。 因为 PL 函数在数据库后端内部执行,所以TRUSTED标志应该只是用于那些不允许访问数据库服务器内部或文件系统的语言。 语言PL/pgSQLPL/TclPL/Perl以及 PL/Python都被认为是可信的。 PL/TclUPL/PerlU,和 PL/PythonU 是设计成提供无限的功能地,因此应该标记为可信的。

Example 36-1 显示了手工过程如何安装 PL/pgSQL 语言。

Example 36-1. 手工安装 PL/pgSQL

下面的命令告诉数据库到那里才能找到用于 PL/pgSQL语言的调用句柄函数的共享对象(目标)。

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

下面的命令

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

声明了前面所定义的调用句柄函数应该是在调用语言属性是 plpgsql的函数,或触发器过程被调用的时候使用。

在缺省的 PostgreSQL 安装里,PL/pgSQL 语言的句柄是制作并安装到 "library" 目录中去的。如果配置了 Tcl/Tk 支持,那么 PL/TclPL/TclU 的句柄也都制作并安装到同一个 未知。类似的还有,如果配置了 Perl,那么PL/PerlPL/PerlU 句柄都会得到制作和安装; 如果配置了 Python,则制作安装 PL/PythonU