PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# CREATE LANGUAGE

## 名称

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

## 大纲

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

## 描述

`CREATE LANGUAGE`可以在PostgreSQL 数据库里注册一个新的语言。从而可以用这种新语言定义函数和触发器程序。

> 注意: 自PostgreSQL 9.1起，大多数过程语言制作成了"扩展"， 并且因此应该使用CREATE EXTENSION安装而不是`CREATE LANGUAGE`。 现在直接使用`CREATE LANGUAGE`应该限制在扩展安装脚本。 如果在你的数据库中有一个"空的"语言，或许由于升级， 你可以使用`CREATE EXTENSION `langname` FROM unpackaged` 将其转换为一个扩展。

`CREATE LANGUAGE`将该语言的名字和一个负责执行该语言所写函数的处理器函数有效的关联起来。 请参考第 52 章获取有关语言处理器的更多信息。

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

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

通常，用户必须拥有PostgreSQL超级用户权限才能注册一个新的语言。 不过，如果语言在`pg_pltemplate`目录中列出， 并且标记为允许通过数据库所有者创建（`tmpldbacreate`为真）， 那么数据库的所有者也可以在该数据库中注册一个新的语言。缺省是受信任的语言可以通过数据库所有者创建， 但是这个可以通过超级用户修改`pg_pltemplate`的内容来调整。 语言的创建者成为它的所有者，并且稍后可以删除、重命名或将其赋予新的所有者。

`CREATE OR REPLACE LANGUAGE`将创建一个新的语言或者替换一个现有的定义。 如果语言早已存在，那么它的参数根据指定的值或`pg_pltemplate` 中的值更新，但是语言的所有关系和权限设置并不改变，并且假设任何该语言写的现有函数都是有效的。 除了创建一个语言所需的普通权限外，用户还必须是超级用户或现有语言的所有者。 `REPLACE`的情况主要是为了用于确保该语言存在。如果该语言有一个 `pg_pltemplate`条目，那么`REPLACE` 实际上并不改变任何现有的定义，除了在`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`(参阅第 48.28 节) 记录了有关当前安装的语言的信息。`createlang` 也有一个选项列出已安装的语言。

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

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

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

在PostgreSQL 7.3之前，必须声明处理器函数返回占位类型 `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 LANGUAGE`是PostgreSQL扩展。

## 又见

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

上一页 | 起始页 | 下一页
CREATE INDEX | 上一级 | CREATE MATERIALIZED VIEW