Chapter 35. 过程语言

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

目前在标准的 PostgreSQL 发布里有四种过程语言可用: PL/pgSQLChapter 36), PL/TclChapter 37), PL/PerlChapter 38),和 PL/PythonChapter 39)。 用户可以定义其它语言。开发一种新的过程语言的基本信息在 Chapter 46 里介绍。

还有几种额外的过程语言没有包含在核心发布里。Appendix H 里面有如何找到它们的信息。

35.1. 安装过程语言

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

对于那些随着标准版本发布的语言,我们只需要执行 CREATE LANGUAGE language_name 来把语言安装到当前数据库中。另外,我么可以使用 createlang 程序在 shell 命令行上安装语言。 比如,要安装PL/pgSQLtemplate1 数据库中,使用

createlang plpgsql template1

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

手工的过程语言安装

一个过程语言是按四个步骤安装到数据库里面去的, 这些任务必须由数据库超级用户执行。 (对于 CREATE LANGUAGE 已知的语言,第二和第三步可以忽略, 因为需要的话这些步骤会自动执行。)

  1. 我们必须被编译和安装该语言句柄的共享对象(目标)必须安装到一个合适的库目录。 这里用的方法和制作安装用户定义的 C 函数的方法是一样的。见 Section 32.9.6。 通常,语言句柄需要外部的库提供实际的编程语言引擎;如果是这样,那么那些库也必须安装。

  2. 语言句柄可以提供一个"验证器"函数,这个函数检查函数定义是否正确, 而不会实际执行它。如果存在验证器函数,那么由 CREATE FUNCTION 调用。 如果一个验证器函数由句柄提供,那么用下面的命令声明

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;

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

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

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

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

Example 35-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 语言的句柄是制作并安装到 "library" 目录中去的。如果配置了 Tcl 支持,那么 PL/TclPL/TclU 的句柄也都制作并安装到同一个 未知。类似的还有,如果配置了 Perl,那么PL/PerlPL/PerlU 句柄都会得到制作和安装; 如果配置了 Python,则制作安装 PL/PythonU