如果你要使用某种过程语言,那么你必须把它"安装"到要使用它的数据库里。不过那些安装到数据库 template1 里的过程语言会自动在随后创建的数据库中安装。因此数据库管理员可以决定哪个数据库可以使用哪种语言,以及决定缺省时可以使用哪些语言。
对于那些随着标准版本发布的语言,只需要使用 CREATE LANGUAGE language_name 把语言安装到当前数据库中即可。另外,也可以使用 createlang 程序在 shell 命令行上安装语言。比如,要将 PL/pgSQL 安装到 template1 数据库中,可以使用
createlang plpgsql template1
下面描述的手工安装方法只适用于那些 CREATE LANGUAGE 还不知道的语言。
手工安装过程语言
一个过程语言是按四个步骤安装到数据库里面去的,这些任务必须由数据库超级用户执行。对于 CREATE LANGUAGE 已知的语言,第二和第三步可以忽略,因为它们会在需要的时候自动执行。
必须编译和安装该语言处理器的共享对象并安装到一个合适的库目录中。方法和安装用户定义的 C 函数的方法(节33.9.6)一样。通常,语言处理器需要外部库提供实际的引擎;如果是这样,那么这些库也必须安装。
处理器必须使用下面的命令声明
CREATE FUNCTION handler_function_name() RETURNS language_handler AS 'path-to-shared-object' LANGUAGE C;
language_handler 的返回类型告诉数据库系统该函数并不返回任何已定义的 SQL 数据类型,并且不能在 SQL 语句中被直接使用。
可选步骤。语言处理器可以提供一个"验证器"函数,这个函数检查函数的定义是否正确,而不会实际执行它。如果存在验证器函数,那么由 CREATE FUNCTION 调用。如果一个验证器函数由处理器提供,那么用下面的命令声明
CREATE FUNCTION validator_function_name(oid) RETURNS void AS 'path-to-shared-object' LANGUAGE C;
PL 必须用下面命令定义
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE language-name HANDLER handler_function_name [VALIDATOR validator_function_name] ;
可选的关键字 TRUSTED 声明一个没有超级用户权限的普通数据库用户能否使用这种语言创建函数和触发器过程。因为 PL 函数在数据库后端内部执行,所以 TRUSTED 标志应该只是用于那些不允许访问数据库服务器内部或文件系统的语言。PL/pgSQL, PL/Tcl, PL/Perl 语言都是可信的。PL/TclU, PL/PerlU, PL/PythonU 都被设计成提供无限的功能,因此不应该标记为可信。
例36-1显示了如何手工安装 PL/pgSQL 语言。
例36-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/Tcl 和 PL/TclU 的处理器也都被编译并安装到同一个位置。类似的还有 PL/Perl 和 PL/PerlU 以及 PL/PythonU 。