# 42.1.安装过程语言

程序语言必须“安装”到要使用它的每个数据库中。但是数据库中安装了过程语言模板1在随后创建的所有数据库中自动可用,因为它们的条目模板1将由创建数据库。因此,数据库管理员可以决定哪些数据库中有哪些语言可用,并且如果需要,可以在默认情况下使某些语言可用。

对于标准发行版提供的语言,只需要执行创建扩展 *语言名称*将语言安装到当前数据库中。下面介绍的手动过程仅建议用于安装尚未打包为扩展的语言。

手动过程语言安装

程序语言分五步安装到数据库中,必须由数据库超级用户执行。在大多数情况下,所需的SQL命令应该打包为“扩展”的安装脚本,以便创建扩展可以用来执行它们。

  1. 语言处理程序的共享对象必须编译并安装到适当的库目录中。这与使用常规用户定义的C函数构建和安装模块的方式相同;看见第38.10.5节.通常,语言处理程序将依赖于提供实际编程语言引擎的外部库;如果是这样,那也必须安装。

  2. 必须使用命令声明处理程序

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

    特殊的返回类型语言处理器告诉数据库系统,此函数不返回已定义的SQL数据类型之一,并且不能在SQL语句中直接使用。

  3. 或者,语言处理程序可以提供执行匿名代码块的“内联”处理程序函数((命令)用这种语言写的。如果语言提供了内联处理程序函数,请使用以下命令声明它:

    CREATE FUNCTION inline_function_name(internal)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    
  4. 或者,语言处理程序可以提供一个“验证器”函数,该函数在不实际执行函数定义的情况下检查函数定义的正确性。验证器函数由创建函数如果存在的话。如果该语言提供了一个验证器函数,那么使用如下命令声明它

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C STRICT;
    
  5. 最后,必须使用命令声明PL

    CREATE [TRUSTED] LANGUAGE language_name
        HANDLER handler_function_name
        [INLINE inline_function_name]
        [VALIDATOR validator_function_name] ;
    

    可选关键字可信的指定该语言不授予对用户本来不会拥有的数据的访问权限。可信语言是为普通数据库用户(那些没有超级用户权限的用户)设计的,允许他们安全地创建函数和过程。由于PL函数是在数据库服务器内部执行的可信的只应为不允许访问数据库服务器内部或文件系统的语言提供标志。PL/pgSQL、PL/Tcl和PL/Perl语言被认为是可信的;PL/TclU、PL/PerlU和PL/PythonU语言旨在提供无限的功能,应该被标记为可信。

例42.1显示了手动安装过程如何使用PL/Perl语言。

例42.1.手动安装PL/Perl

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

CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
    '$libdir/plperl' LANGUAGE C;

PL/Perl有一个内联处理函数和一个验证器函数,所以我们也声明它们:

CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;

CREATE FUNCTION plperl_validator(oid) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;

命令:

CREATE TRUSTED LANGUAGE plperl
    HANDLER plperl_call_handler
    INLINE plperl_inline_handler
    VALIDATOR plperl_validator;

然后定义,对于语言属性为的函数和过程,应该调用之前声明的函数plperl.

在默认的PostgreSQL安装中,PL/pgSQL语言的处理程序被构建并安装到“library”目录中;此外,PL/pgSQL语言本身安装在所有数据库中。如果在中配置了Tcl支持,则PL/Tcl和PL/TclU的处理程序将构建并安装在库目录中,但默认情况下,该语言本身不会安装在任何数据库中。同样,如果配置了Perl支持,则会构建和安装PL/Perl和PL/PerlU处理程序,如果配置了Python支持,则会安装PL/PythonU处理程序,但默认情况下不会安装这些语言。