9.1第三十八章
第三十八章 过程语言
PostgreSQL允许用户定义的函数使用SQL和C之外的语言编写。通常这些额外的语言叫做过程语言(PLs)。如果我们用一种过程语言书写了一个函数,那么数据库服务器是没有任何内建的知识获知如何解析该函数的源文本的。实际上这些任务都传递给一个知道如何处理这些细节的句柄处理。 这个句柄既可以自己干所有的分析,语法分析,执行等的工作,也可以充当PostgreSQL和一种现有的编程语言实现之间的"胶水"。句柄本身是一C语言函数,它被编译成一种共享对象并且在需要的时候装载,就像其它C函数一样。
目前在标准的 PostgreSQL 发布里有四种过程语言可用:PL/pgSQL(Chapter 39),PL/Tcl(Chapter 40),PL/Perl(Chapter 41)和PL、Python(Chapter 42)。还有几种额外的过程语言没有包含在核心发布里。AppendixG中有关于他们的信息。用户可以定义其它语言。开发一种新的过程语言的基本信息在 Chapter 49 里介绍。
38.1. 安装过程语言
如果你要试用某种过程语言,你必须要将它安装在数据库中。不过那些安装到数据库 template1 里的过程语言会自动在随后创建的数据库中安装,因为他们在template1中的条目将会被CREATE DATABASE命令复制。所有,数据管理员可以决定用哪种语言,以及缺省时用哪个语言。
对于那些随着标准版本发布的语言,只需要用CREATE EXTENSION language_name在当前数据库中进行安装。或者可以用程序createlang在shell命令行进行安装。例如,在数据库template1中安装PL/Perl语言,使用:
createlang plperl template1
下面描述的手工安装的方法只是适用于那些createlang还不知道的语言。
手动安装过程语言
在数据库中安装过程语言有五个步骤,首先必须是数据库的超级用户。在大多数情况下,所需的SQL命令应该被打包为一个“扩展”的安装脚本,以便用CREATE EXTENSION命令执行它。
1.语言句柄的共享对象必须被编译并且安装在一个合适的库目录。这个工作使用的方法跟创建和安装一个用户自定义的C函数是一样的;见Section 35.9.6。通常,一个语言的句柄依赖与一个外部的库来提供实际的程序语言引擎;如果是这样,那么那些库也需要安装.
2.句柄必须用命令进行声明
CREATE FUNCTION handler_function_name() RETURNS language_handler AS 'path-to-shared-object' LANGUAGE C;
这个特殊的language_handler返回类型是告诉数据库系统这个函数不返回已定义的SQL数据类型,不能直接在SQL语句中使用。
3.这个语言句柄能提供一个“排队法(inline)”处理函数,在这个编写的语言中匿名的执行代码块(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] [PROCEDURAL] LANGUAGE language-name HANDLER handler_function_name [INLINE inline_function_name] [VALIDATOR validator_function_name] ;
这个可选的关键字TRUSTED声明用户是否有权限来访问这个数据。TRUSTED用于为普通的数据库用户(没有超级用户权限)有权限使用这种语言创建函数和触发器过程。由于PL函数是在数据库内部执行,所以这个TRUSTED标志只用于那些不允许访问数据库内部或者文件系统的语言。语言PL/pgSQL,PL/Tcl和PL/Perl都被认为是可信的,语言PL/TclU,PL/PerlU和PL/PythonU被设计成提供无限制的功能,因此不应该标志成可信的。
Example 38-1 显示如何手工安装PL/Perl过程语言。
Example 38-1. 手工安装 PL/Perl
下面的命令告诉数据库到那里才能找到用于 PL/pgSQL语言的调用句柄函数的共享对象:
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;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS '$libdir/plperl' LANGUAGE C STRICT;
这个命令:
CREATE TRUSTED PROCEDURAL 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句柄将创建和安装在library目录中,但是这个语言本身默认不会安装在任意一个数据库中。同样的,如果Perl被配置成支持,那么这个PL/Perl和PL/PerlU句柄也将被创建和安装,并且如果Python被配置成支持,PL/PythonU句柄也将会被安装,但是这个语言默认将不会被安装。