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 55

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

  • TRUSTED

    • TRUSTED指定该语言不会授予用户否则无法访问的数据的访问权限。如果在注册语言时省略此关键字,则只有具有 PostgreSQL 超级用户特权的用户才能使用该语言创建新功能。
  • PROCEDURAL

    • 这是一个干扰词。
  • name

    • 新程序语言的名称。该名称在数据库中的语言之间必须唯一。

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

  • HANDLER call_handler

      • call_handler *是先前注册的函数的名称,将调用该函数来执行过程语言的功能。程序语言的调用处理程序必须使用编译后的语言编写,例如 C,具有版本 1 调用约定,并已在 PostgreSQL 中注册为不带参数且返回language_handler类型的函数,该类型仅用于将函数标识为:呼叫处理程序。
  • INLINE inline_handler

      • inline_handler 是先前注册的函数的名称,该函数将被调用以执行该语言的匿名代码块(DO命令)。如果未指定 inline_handler *函数,则该语言不支持匿名代码块。处理函数必须采用internal类型的一个参数,该参数将是DO命令的内部表示形式,并且通常返回void。处理程序的返回值将被忽略。
  • VALIDATOR valfunction

      • valfunction *是先前注册的函数的名称,当使用该语言创建新函数时,该函数将被调用以验证新函数。如果未指定验证器功能,则在创建新功能时将不对其进行检查。验证器函数必须采用类型oid的一个参数,该参数将是要创建的函数的 OID,并且通常返回void

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

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

Notes

使用DROP LANGUAGE删除程序语言。

系统目录pg_language(请参阅Section 51.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