2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 7.3 / 7.2

40.1. 安装过程语言 #

过程语言必须被“安装”到每个要使用该语言的数据库中。但是,安装在 template1 数据库中的过程语言在所有后续创建的数据库中都是自动可用的,因为它们在 template1 中的条目会被 CREATE DATABASE 命令复制。因此,数据库管理员可以决定在哪些数据库中可用哪些语言,并可以在需要时使某些语言默认可用。

对于标准发行版中提供的语言,只需执行 CREATE EXTENSION language_name 即可将语言安装到当前数据库。下面描述的手动过程仅推荐用于安装尚未打包为扩展的语言。

手动安装过程语言

过程语言的安装在一个数据库中有五个步骤,必须由数据库超级用户执行。在大多数情况下,所需的 SQL 命令应该打包成一个“扩展”的安装脚本,以便可以使用 CREATE EXTENSION 来执行它们。

  1. 语言处理器的共享对象必须被编译并安装到一个合适的库目录中。这与构建和安装普通用户定义 C 函数的模块的方式相同;参见 第 36.10.5 节。通常,语言处理器会依赖一个提供实际编程语言引擎的外部库;如果是这样,该库也必须被安装。

  2. 必须使用以下命令声明处理器

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

    特殊的返回类型 language_handler 告诉数据库系统该函数不返回已定义的SQL数据类型,并且不能直接用于SQL语句。

  3. 可选地,语言处理器可以提供一个“内联”处理器函数,该函数用于执行用该语言编写的匿名代码块(DO 命令)。如果语言提供了内联处理器函数,请使用类似以下命令的命令声明它:

    CREATE FUNCTION inline_function_name(internal)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    
  4. 可选地,语言处理器可以提供一个“验证器”函数,该函数可以在不实际执行函数定义的情况下检查其正确性。如果存在验证器函数,CREATE FUNCTION 将调用该函数。如果语言提供了验证器函数,请使用类似以下命令的命令声明它:

    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] ;
    

    可选关键字 TRUSTED 指定该语言不授予用户本来无法访问的数据。受信任的语言是为普通数据库用户(没有超级用户权限的用户)设计的,并允许他们安全地创建函数和过程。由于 PL 函数在数据库服务器内部执行,因此 TRUSTED 标志只能用于不允许访问数据库服务器内部或文件系统的语言。PL/pgSQLPL/TclPL/Perl 被认为是受信任的;PL/TclUPL/PerlUPL/PythonU 的设计目的是提供无限功能,并且 应该被标记为受信任。

示例 40.1  展示了手动安装过程如何与 PL/Perl 语言配合使用。

示例 40.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 语言的处理器被编译并安装到“”目录中;此外,PL/pgSQL 语言本身就安装在所有数据库中。如果配置了 Tcl 支持,PL/TclPL/TclU 的处理器会被编译并安装到库目录中,但该语言本身默认不会安装到任何数据库中。同样,如果配置了 Perl 支持,PL/PerlPL/PerlU 的处理器会被编译并安装,如果配置了 Python 支持,PL/PythonU 的处理器会被安装,但这些语言默认不会被安装。

提交更正

如果您在文档中发现任何不正确之处、与您对特定功能的体验不符之处或需要进一步澄清之处,请使用 此表单 报告文档问题。