On this page
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
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 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