第四十九章. 过程语言

Postgres 就支持过程语言的定义.当碰到函数或触发器过程是用过程语言定义的时候,数据库内部并不知道如何解释这些函数源代码文本.取而代之的是,调用将被传递到一个认知该语言详情的控制器中去.该控制器本身是一个编译成共享对象的特殊的编程语言函数,在需要的时候被调用.

为一种新的过程语言(PL)书写一个控制器的论题超出本手册范围.

安装过程语言

过程语言的安装

一个过程语言是按三个步骤安装到数据库里面去的.(对于随标准版本提供的过程语言,可以用 shell 脚本 createlang 代替手工操作.)

    该语言的控制器的共享对象(目标)必须被编译和安装.缺省时用于 PL/pgSQL 的控制器将被制作和安装到数据库的库目录.如果 配置了 Tcl/TK 的支持,用于 PL/Tcl 的控制器同样被制作和安装到相同的目录中去.

    控制器必须用下面命令声明

    CREATE FUNCTION handler_function_name ()
        RETURNS OPAQUE AS
        'path-to-shared-object' LANGUAGE 'C';
    特殊的返回类型 OPAQUE 告诉数据库,这个函数并不返回一个基本的或复合的数据类型并且是不能直接在SQL 语句里面使用.

    PL 必须用下面命令定义

    CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'language-name'
        HANDLER handler_function_name
        LANCOMPILER '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/tcl也要用上面的两个命令来生效,缺省时两种过程语言都没有生效,都需要安装.要注意的是pl/tcl过程语言的安装需要系统中装有共享库的Tcl脚本语言,如没有需要先行安装,注意一定要编译成共享库,然后可以到.../postgresql/src/pl/tcl目录下重新编译,生成pltcl.so后再用上面方法安装,在我的Slackware4.0机器上,需要修改Makefile.tcldefs文件的TCL_SHARED_BUILD定义使其=1方可编译成功.安装时别忘了把上面两条命令的'PL/PgSQL'改成'PL/TCL',plpgsql.so改成pltcl.so.请大家安装时注意.或者可以在配置的时候在 configure 里加入 --witch-tclconfig=/some_place.)

    PL 控制器函数有一个特殊的调用接口,该接口与通常的 C 语言函数不同.传递给控制器的一个参数是将要被执行的函数在 pg_proc 里的对象标识(OID).控制器检查各种各样的系统表,分析函数调用参数和它的返回数据的类型.函数体的源码文本放在 pg_proc 里 prosrc 字段.因此与 C 语言函数对比,PL 函数可以象 SQL 语言函数那样重载.可以有多个不同的 PL 函数拥有同样的函数名,只要调用参数是不一样的即可.

    template1 数据库里定义的过程语言自动在随后创建的数据库里面定义.所以数据库管理员可以决定那种语言缺省时可用.