第 42 章 过程语言
从 6.3 版发布开始,Postgres 支持定义过程语言。对于用过程语言定义的函数或触发器过程,数据库并不内置关于如何解释函数源文本的知识。相反,调用会被传递给一个了解该语言细节的调用处理器。调用处理器本身是一个特殊的编程语言函数,被编译进共享对象并按需装载。
42.1. 安装过程语言
过程语言的安装
在数据库中安装过程语言需要三个步骤。
该语言调用处理器的共享对象必须编译并安装。默认情况下,PL/pgSQL 的调用处理器会被构建并安装到数据库库目录中。如果配置了 Tcl/Tk 支持,PL/Tcl 的调用处理器也会被构建并安装到同一位置。
编写新过程语言(PL)的调用处理器超出了本手册的范围。
处理器必须用命令
CREATE FUNCTION
handler_function_name() RETURNS OPAQUE AS 'path-to-shared-object' LANGUAGE 'C';声明。特殊的返回类型 OPAQUE 告诉数据库,这个函数不返回任何已定义的基本类型或组合类型,不能直接在 SQL 语句中使用。
PL 必须用命令
CREATE [ TRUSTED ] PROCEDURAL LANGUAGE '
language-name' HANDLERhandler_function_nameLANCOMPILER 'description';声明。可选关键字 TRUSTED 指明没有超级用户权限的普通数据库用户能否使用这种语言创建函数和触发器过程。由于 PL 函数在数据库后端内部执行,它只应用于不会访问数据库后端内部结构或文件系统的语言。PL/pgSQL 和 PL/Tcl 语言已知是可信的。
示例
下面的命令告诉数据库到哪里查找 PL/pgSQL 语言调用处理器函数的共享对象:
CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';而命令
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL';则定义对于语言属性为 'plpgsql' 的函数和触发器过程,将调用先前声明的调用处理器函数。
PL 调用处理器函数有一个与普通 C 语言函数不同的特殊调用接口。传给调用处理器的参数之一是要执行的函数在
pg_proc表条目中的对象 ID。调用处理器会检查各种系统目录来分析函数的调用参数及其返回数据类型。函数主体的源文本位于pg_proc的 prosrc 属性中。因此,与 C 语言函数不同,PL 函数可以像 SQL 语言函数一样被重载。只要调用参数不同,就可以有多个同名的不同 PL 函数。在
template1数据库中定义的过程语言会自动在随后创建的所有数据库中定义。因此数据库管理员可以决定默认提供哪些语言。