CREATE [ PROCEDURAL ] LANGUAGE name CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ VALIDATOR valfunction ]
CREATE LANGUAGE 可以在 PostgreSQL 数据库里注册一个新的语言。从而可以用这种新语言定义函数和触发器。只有超级用户可以注册新语言。
CREATE LANGUAGE 将该语言的名字和一个负责执行该语言函数的调用处理器关联起来。请参考章36获取有关语言调用处理器的更多信息。
有两种形式的 CREATE LANGUAGE 命令。第一种形式,用户只提供需要的语言的名字,然后 PostgreSQL 服务器参考 pg_pltemplate 系统表来判断正确的参数。第二种形式,用户把语言参数和语言名字一起提供。第二种形式可以用于创建没有在 pg_pltemplate 里面定义的语言,不过这种方法被认为已经过时了。
如果服务器在 pg_pltemplate 系统表里面找到给出的语言名字的纪录,那么它将使用系统表的数据,即使命令包含语言参数也如此。这个行为简化了加载旧的转储文件的过程,因为这些转储文件很可能包含有关语言支持函数的过时信息。
TRUSTED 说明对该语言的调用处理器是安全的;也就是说,它不会提供给非特权用户任何绕过访问限制的能力。如果忽略这个关键字,只有 PostgreSQL 超级用户可以使用这个语言创建新函数。
这是个没有用的字
新过程语言的名称。语言名是大小写无关的。这个名字应该在数据库的所有语言中唯一。
出于向下兼容的原因,这个名字可以用单引号包围。
call_handler 是一个以前注册过的函数名字,该函数将被用来执行该过程语言的函数。过程语言的调用处理器必须用一种编译语言(比如 C)书写,调用风格必须是版本-1 的调用风格,并且注册为不接受参数并且返回 language_handler 类型的函数。language_handler 是用于将函数声明为调用处理器的占位符。
valfunction 是一个以前注册过的函数名字,在用该语言创建新函数的时候将用它来校验新函数。如果没有声明校验函数,那么建立新函数的时候就不会检查它。校验函数必须接受一个类型为 oid 的参数,它是将要创建的函数的 OID ,并且通常会返回 void 。
校验函数通常会检查函数体,看看有没有语法错误,但是它也可以查看函数的其它属性,比如该语言是否不能处理某种参数类型。校验函数应该用 ereport()
函数报告错误。该函数的返回值将被忽略。
如果服务器在 pg_pltemplate 系统表里有对应名称的语言纪录,那么 TRUSTED 选项和支持函数的名字等参数将被忽略。
createlang 程序是对 CREATE LANGUAGE 命令的一个简单封装。降低了在 shell 命令行上安装过程语言的难度。
使用 DROP LANGUAGE 命令,或者更好是 droplang 程序来删除一个过程语言。
系统表 pg_language
(参阅 节43.20)记录了更多有关当前安装的过程语言的信息。createlang 也有一个选项列出已安装的语言。
要使用一种过程语言创建函数,用户必须对该语言有 USAGE 权限。缺省时,对于可信的语言,USAGE 是赋与 PUBLIC(也就是每个人)的。需要时,这个权限可以撤销。
过程语言是对每个独立数据库本地创建的。不过,语言可以安装到 template1 里面,这样就会导致它自动在所有随后创建的数据库里可用。
如果服务器在 pg_pltemplate 系统表里还没有对应该语言的纪录,那么调用处理器函数和校验函数(如果有)必须已经存在。但是如果存在这样的纪录,那么这些函数就不必已经存在;如果没有在数据库里出现,它们将会被自动定义。如果实现语言的共享库不可获得,那么可能会导致 CREATE LANGUAGE 失效。
在 PostgreSQL 7.3 之前,必须声明处理器函数返回占位类型 opaque ,而不是 language_handler 。为了支持加载旧的转储文件,CREATE LANGUAGE 还将接受声明为返回 opaque 的函数,但是它会发出一条通知并且把函数的返回类型改为 language_handler 。