Note

CREATE LANGUAGE

创建语言-定义新的程序语言

Synopsis

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

Description

CREATE LANGUAGE在 PostgreSQL 数据库中注册新的过程语言。随后,可以用这种新语言定义功能和过程。

Note

从 PostgreSQL 9.1 开始,大多数过程语言都已被制成“extensions”,因此应使用CREATE EXTENSION而不是CREATE LANGUAGE进行安装。现在,直接将CREATE LANGUAGE的使用限制在扩展安装脚本中。如果您的数据库中有“裸”语言(可能是升级的结果),则可以使用CREATE EXTENSION langname FROM unpackaged将其转换为 extensions。

CREATE LANGUAGE有效地将语言名称与处理程序函数相关联,这些处理函数负责执行以该语言编写的函数。有关语言处理程序的更多信息,请参考Chapter 56

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条目。

Parameters

为了向后兼容,名称可以用单引号引起来。

验证器函数通常会检查函数主体的语法正确性,但它也可以查看函数的其他属性,例如,如果语言无法处理某些自变量类型。要发出错误 signal,验证器函数应使用ereport()函数。该函数的返回值将被忽略。

如果服务器在pg_pltemplate中具有用于指定语言名称的条目,则将忽略TRUSTED选项和支持功能名称。

Notes

使用DROP LANGUAGE删除程序语言。

系统目录pg_language(请参阅Section 52.29)记录有关当前安装的语言的信息。另外,psql 命令\dL列出了已安装的语言。

要使用过程语言创建函数,用户必须具有该语言的USAGE特权。默认情况下,将USAGE授予PUBLIC(即所有人)以使用受信任的语言。如果需要,可以将其撤消。

过程语言是单个数据库的本地语言。但是,可以将一种语言安装到template1数据库中,这将导致该语言在所有随后创建的数据库中自动可用。

如果服务器在pg_pltemplate中没有该语言的条目,则呼叫处理程序函数,内联处理程序函数(如果有)和验证器函数(如果有)必须已经存在。但是,当有一个条目时,这些功能不必已经存在;如果数据库中不存在它们,它们将被自动定义。 (如果实现该语言的共享库在安装中不可用,则可能导致CREATE LANGUAGE失败.)

在 7.3 之前的 PostgreSQL 版本中,必须声明处理程序函数以返回占位符类型opaque而不是language_handler。为了支持加载旧的转储文件,CREATE LANGUAGE将接受一个声明为返回opaque的函数,但它将发出通知并将该函数的声明的返回类型更改为language_handler

Examples

创建任何标准过程语言的首选方式是:

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;

Compatibility

CREATE LANGUAGE是 PostgreSQL 扩展。

See Also

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

上一章 首页 下一章