Table of Contents
PostgreSQL允许使用 SQL 和 C 之外的其他语言 编写用户定义的函数。这些语言统称为过程语言 (PL)。对于用过程语言编写的函数,数据库服务器 并不内置关于如何解释函数源文本的知识。相反,这项任务会交给一个了解该 语言细节的专门的调用处理器。该调用处理器既可以自行完成解析、语法分析、 执行等全部工作,也可以在PostgreSQL与某种 现有编程语言实现之间充当“粘合剂”。与其他任何 C 函数一样, 调用处理器本身也是一个被编译进共享对象并按需装载的 C 语言函数。
标准PostgreSQL发行版当前提供四种过程语言: PL/pgSQL(Chapter 41)、 PL/Tcl(Chapter 42)、 PL/Perl(Chapter 43)以及 PL/Python(Chapter 44)。 另有一些可用的过程语言并未包含在核心发行版中。 Appendix H提供了查找它们的信息。此外,用户还可 以自行定义其他语言;开发新过程语言的基础知识见 Chapter 56。
过程语言必须在每个要使用它的数据库中“安装”。不过,安装在 数据库template1中的过程语言会自动在随后创建的所有 数据库中可用,因为它们在template1中的条目会由 CREATE DATABASE复制。因此,数据库管理员可以决定哪 些数据库提供哪些语言,并且如果需要,还可以让某些语言默认可用。
对于标准发行版附带的语言,只需执行 CREATE EXTENSION language_name,即可将该语言安装到当前数据库 中。下文所述的手工过程只建议用于安装那些尚未打包为扩展的语言。
手工安装过程语言
在数据库中安装过程语言需要五个步骤,且必须由数据库超级用户执行。多数 情况下,所需的 SQL 命令都应打包成某个“扩展”的安装脚本, 这样就可以用CREATE EXTENSION来执行它们。
该语言调用处理器的共享对象必须先编译好并安装到合适的库目录中。这与 构建和安装含有普通用户定义 C 函数的模块的方法相同;见 Section 36.10.5。该语言调用处理器往往还会依赖一个提供实际编 程语言引擎的外部库;如果是这样,该库也必须安装。
必须用如下命令声明该调用处理器:
CREATE FUNCTIONhandler_function_name() RETURNS language_handler AS 'path-to-shared-object' LANGUAGE C;
特殊返回类型language_handler会告诉数据库系统,该函数返 回的不是某种已定义的SQL数据类型,并且不能在 SQL语句中直接使用。
可选地,语言调用处理器可以提供一个“内联”处理器函数, 用于执行用该语言编写的匿名代码块 (DO命令)。如果 该语言提供了内联处理器函数,可用类似下面的命令声明它:
CREATE FUNCTIONinline_function_name(internal) RETURNS void AS 'path-to-shared-object' LANGUAGE C;
可选地,语言调用处理器可以提供一个“验证器”函数,用于 在不实际执行的情况下检查函数定义是否正确。如果存在验证器函数, CREATE FUNCTION就会调用它。如果该语言提供了验证 器函数,可用类似下面的命令声明它:
CREATE FUNCTIONvalidator_function_name(oid) RETURNS void AS 'path-to-shared-object' LANGUAGE C STRICT;
最后,必须用如下命令声明该 PL:
CREATE [TRUSTED] LANGUAGElanguage_nameHANDLERhandler_function_name[INLINEinline_function_name] [VALIDATORvalidator_function_name] ;
可选关键字TRUSTED表示,该语言不会授予用户原本不 具备的数据访问能力。受信任的语言是为普通数据库用户(即没有超级用户 权限的用户)设计的,并允许他们安全地创建函数和过程。由于 PL 函数是 在数据库服务器内部执行的,因此只有那些不允许访问数据库服务器内部或 文件系统的语言才应带有TRUSTED标记。 PL/pgSQL、 PL/Tcl以及 PL/Perl被认为是受信任的;而 PL/TclU、 PL/PerlU以及 PL/PythonU旨在提供无限制的功能,因此 不应被标记为受信任的。
Example 40.1展示了以 PL/Perl为例时,手工安装过程是如何进行的。
Example 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语言的调用处理器会被构建并安装到 “library”目录中;此外, PL/pgSQL语言本身也安装在所有数据库中。如 果在构建时配置了Tcl支持,那么 PL/Tcl和PL/TclU 的调用处理器会被构建并安装到该库目录中,但这两种语言本身默认并不会安 装到任何数据库中。同样,如果在构建时配置了 Perl 支持,就会构建并安装 PL/Perl和PL/PerlU 的调用处理器;如果在构建时配置了 Python 支持,则会安装 PL/PythonU的调用处理器,但这些语言默认也 不会安装到任何数据库中。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。