CREATE LANGUAGE

Name

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

Synopsis

CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE name
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]

描述

CREATE LANGUAGE通过一个PostgreSQL 数据库注册了一个新的程序语言。后来,函数和触发器程序可以通过这个新语言定义。

CREATE LANGUAGE有效地用处理程序函数关联语言名称,其中 这些处理程序函数是负责执行用该语言写的函数的。参考Chapter 49 获取更多关于语言处理程序的信息。

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

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

通常地,用户必须有PostgreSQL超级用户权限 来注册一个新语言。然而,数据库的所有者能在那个数据库内注册一个新语言, 若该语言被列入pg_pltemplate目录并被标记为 允许被数据库所有者创建(tmpldbacreate为真)。默认是 信任的语言可以通过数据库所有者来创建,但这可以被超级用户通过更改 pg_pltemplate的内容来调整。一个语言的创建者 变成了其所有者并且可以删除它、重命名它或者将它分配给一个新的所有者。

CREATE OR REPLACE LANGUAGE将会要么创建一个新语言要么替代 一个已有定义。如果语言已经存在,它的参数会根据来自pg_pltemplate 的值来更新,但是语言的所属关系和许可设置不会更改,并且任何用该语言写的程序 都假定为仍然有效。除了请求创建一种语言的常规权限,要获得其他权限用户必须是 现有语言的超级用户或者所有者。REPLACE主要是用来确保语言存在的。 若语言有pg_pltemplate条目,那么 pg_pltemplate实际上并不能改变任何现有的定义,除了在 不寻常的情况下,像pg_pltemplate条目在语言创建后被更改。

参数

TRUSTED

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

PROCEDURAL

这是个没有用的字

name

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

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

HANDLER call_handler

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

INLINE inline_handler

inline_handler是一个先前 已注册的函数的名称,且该函数将会通过该语言被调用来执行一个匿名代码块 (DO命令)。若未指定 inline_handler函数,那么该 语言将不支持匿名代码块。处理程序函数必须带有internal类型 参数,这将会作为DO命令的内部表征,并且通常会返回void。 忽略处理程序的返回值会。

VALIDATOR valfunction

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

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

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

注意

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

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

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

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

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

调用处理程序函数,内联处理函数(若存在),以及验证器函数(若存在)必须是 已存在的,若服务器在pg_pltemplate中没有语言的记录。 但是当有一条记录时,这个函数不需要提前存在;若不在数据库中,这些函数将会 被自动定义。(若实现语言的共享库不出现在安装过程中,这会导致 CREATE LANGUAGE失败。)

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

示例

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

CREATE LANGUAGE plperl;

对于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