CREATE LANGUAGE

Name

CREATE LANGUAGE -- 定义一种新的过程语言

Synopsis

CREATE [ PROCEDURAL ] LANGUAGE name
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ VALIDATOR valfunction ]

描述

使用 CREATE LANGUAGE, 一个PostgreSQL 用户可以在 PostgreSQL里注册一个新的语言。 因而,函数和触发器过程可以用这种新语言定义。要注册新语言用户必须具有 PostgreSQL 超级用户权限。

CREATE LANGUAGE 将该语言的名字和一个调用句柄关联起来,而该调用句柄负责执行该语言书写的函数。 请参考 Chapter 35 获取有关语言调用句柄的更多信息。

有两种形式的 CREATE LANGUAGE 命令。 第一种形式,用户只提供需要的语言的名字,然后 PostgreSQL 服务器参考系统表 pg_pltemplate 来判断正确的参数。第二种形式,用户把语言参数和语言名字一起提供。 第二种形式可以用于创建没有在 pg_pltemplate 里面定义的语言, 不过这种方法已经被认为是过时的了。

如果服务器在 pg_pltemplate 系统表里面找到给出的语言名字的纪录, 那么它将使用系统表的数据,即使命令包含语言参数也如此。这个行为简化了装载旧的转储文件的过程, 因为这些转储文件很可能包含有关语言支持函数的过时信息。

参数

TRUSTED

TRUSTED 说明对该语言的调用句柄是安全的; 也就是说,它不会提供给非特权用户任何绕过访问限制的能力。 如果忽略这个关键字,只有具有 PostgreSQL 超级用户权限的人可以使用这个语言创建新的函数。

PROCEDURAL

这是个没有用的字。

name

新的过程化语言的名称。语言名是大小写无关的。 这个名字应该在数据库的所有语言中唯一。

出于向下兼容的原因,这个名字可以用单引号包围。

HANDLER call_handler

call_handler 是一个以前注册过的函数的名字,该函数将被调用来执行这门过程语言写的函数。 过程语言的调用句柄必须用一种编译语言书写,比如 C,调用风格必须是版本 1 的调用风格, 并且在 PostgreSQL 里注册为不接受参数并且返回 language_handler 类型的函数, language_handler 是用于将函数声明为调用句柄的占位符。

VALIDATOR valfunction

valfunction 是一个已经注册的函数的名字, 在用该语言创建新函数的时候将调用它来校验新函数。如果没有声明校验函数,那么建立新函数的时候就不会检查它。 校验函数必须接受一个类型为 oid 的参数,它是将要创建的函数的 OID,并且通常会返回 void

校验函数通常会检查函数体,看看看有没有语法错误,但是它也可以查看函数的其它属性, 比如该语言是否不能处理某种参数类型。要发出一个错误,校验函数应该用 elog() 函数。 该函数的返回值将被忽略。

如果服务器在 pg_pltemplate 系统表里有对应名称的语言之纪录, 那么 TRUSTED 选项和支持函数的名字等参数将被忽略。

注意

createlang 程序是在 CREATE LANGUAGE 命令上的一个简单封装。它降低了在 shell 命令行上安装过程语言的难度。

使用 DROP LANGUAGE, 或者更好是 droplang 程序来删除一个过程语言。

系统表 pg_language (参阅 Section 42.20) 记录了更多有关当前安装的过程语言的信息。createlang 也有一个选项列出已安装的语言。

要使用一种过程语言创建函数,用户必须对该语言有 USAGE 权限。 缺省时,对于可信的语言,USAGE 是赋与 PUBLIC (也就是每个人)的。 需要时,这个权限可以撤销。

过程语言是对每个独立数据库本地创建的。不过,一种语言可以安装到 template1 里面,这样就会导致它自动在所有随后创建的数据库里可用。

如果服务器在 pg_pltemplate 系统表力还没有对应该语言的纪录, 那么调用句柄函数和校验函数(如果有)必须已经存在。但是如果存在这样的纪录, 那么这些函数就不必已经存在;如果没有在数据库里出现,它们将会被自动定义。 (如果实现语言的共享库在安装中不可活得,那么这样可能会导致 CREATE LANGUAGE 失效。)

PostgreSQL 版本 7.3 之前, 我们必须声明句柄函数返回占位类型 opaque,而不是 language_handler。 为了支持装载旧的转储文件,CREATE LANGUAGE 还将接受声明为返回 opaque 的函数, 但是它会发出一条通知并且把函数声明返回类型改为 language_handler

例子

创建标准的过程语言的比较好的方法:

CREATE LANGUAGE plpgsql;

对于 pg_pltemplate 里面还不知道的语言,我们需要下面这样的序列:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

兼容性

CREATE LANGUAGEPostgreSQL 扩展。

又见

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE, createlang, droplang