CREATE LANGUAGE
CREATE LANGUAGE¶
定义一种新的过程语言。
- 语法
-
``` sql CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE name
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
```
- 描述
-
CREATE LANGUAGE
在SeaboxMPP数据库中注册了新的过程语言。 随后,可以用这种新语言定义函数和触发过程。注意: SeaboxMPP数据库的过程语言已被制成“扩展名”,因此应与CREATE EXTENSION一起安装,而不是
CREATE LANGUAGE
。 直接使用CREATE LANGUAGE
应该仅限于扩展安装脚本。 如果数据库中存在“裸”语言(可能是升级的结果),则可以使用CREATE EXTENSION langname FROM unpackaged
将其转换为扩展名。超级用户可以在SeaboxMPP数据库中注册新语言。 数据库所有者还可以在该数据库中注册
pg_pltemplate
catalog中列出的tmpldbacreate
字段为true的任何语言。 默认配置仅允许数据库所有者注册受信任的语言。语言的创建者成为其所有者,以后可以将其删除,重命名或将所有权分配给新所有者。CREATE OR REPLACE LANGUAGE
将创建新语言或替换现有定义。如果该语言已经存在,则其参数将根据pg_pltemplate
中指定的值或从pg_pltemplate
中获取的值进行更新,但该语言的所有权和权限设置不会更改,并且假定使用该语言编写的任何现有函数仍然有效。除了创建语言的正常权限要求外,用户还必须是现有语言的超级用户或所有者。REPLACE
情况主要用于确保该语言存在。如果该语言具有pg_pltemplate
条目,则REPLACE
实际上不会更改有关现有定义的任何内容,除非在异常情况下自创建该语言以来已对pg_pltemplate
条目进行了修改。CREATE LANGUAGE
有效地将语言名称与处理程序函数关联,该处理函数负责执行以该语言编写的函数。 对于以过程语言(C或SQL以外的语言)编写的函数,数据库服务器没有有关如何解释函数源代码的内置知识。该任务将传递给知道该语言详细信息的特殊处理程序。处理程序可以执行解析,语法分析,执行等所有工作,也可以充当SeaboxMPP数据库与编程语言的现有实现之间的桥梁。处理程序本身是一种C语言函数,已编译为共享对象并按需加载,就像其他任何C函数一样。这些过程语言程序包包含在标准的SeaboxMPP数据库发行版中:PL/pgSQL,PL/Perl和PL/Python。还为PL/Java和PL/R添加了语言处理程序,但是SeaboxMPP数据库未预安装这些语言。PL/Perl,PL/Java和PL/R库分别需要安装正确版本的Perl,Java和R。
CREATE LANGUAGE
命令有两种形式:在第一种形式中,用户指定所需语言的名称,SeaboxMPP数据库服务器使用
pg_pltemplate
系统catalog来确定正确的参数。在第二种形式中,用户指定语言参数以及语言名称。 您可以使用第二种形式来创建
pg_pltemplate
中未定义的语言。当服务器在
pg_pltemplate
catalog中找到给定语言名称的条目时,即使命令包含语言参数,它也会使用catalog数据。此行为简化了旧转储文件的加载,这些文件可能包含有关语言支持函数的过时信息。 - 参数
-
该SQL命令参数说明见下
TRUSTED
TRUSTED
指定该语言不会授予用户原本就不会访问的数据的访问权限。如果在注册语言时省略此关键字,则只有具有SeaboxMPP数据库超级用户权限的用户才能使用该语言创建新函数。- PROCEDURAL
- 这是一个干扰词。
name
-
新过程语言的名称。 该名称在数据库中的语言之间必须唯一。 包含对
plpgsql
,plperl
和plpythonu
的内置支持。默认情况下,在SeaboxMPP数据库中已默认安装了语言
plpgsql
(PL/pgSQL)和plpythonu
(PL/Python)。 HANDLER call_handler
-
如果服务器在
pg_pltemplate
中有用于指定语言名称的条目则忽略。 先前注册的函数的名称,将调用该函数来执行过程语言函数。程序语言的调用处理程序必须使用编译后的语言编写,例如使用版本1调用约定的C语言,并在SeaboxMPP数据库中注册为不带任何参数的函数,并返回
language_handler
类型,该仅是用于标识函数的占位符类型作为呼叫处理程序。 INLINE inline_handler
-
以前注册的函数的名称,该函数被调用以执行用
DO
命令创建的该语言的匿名代码块。如果未指定inline_handler
函数,则该语言不支持匿名代码块。处理函数必须采用类型为internal
的一个参数,即DO
命令的内部表示形式。该函数通常返回
void
。 处理程序的返回值将被忽略。 VALIDATOR valfunction
-
如果服务器在
pg_pltemplate
中有用于指定语言名称的条目则忽略。 先前注册的函数的名称,将调用该函数来执行过程语言函数。程序语言的调用处理程序必须使用编译式语言编写,例如使用版本1调用约定的C语言,并在SeaboxMPP数据库中注册为不带任何参数的函数,并返回
language_handler
类型,该仅是用于标识函数的占位符类型作为呼叫处理程序。
- 注解
-
默认情况下,PL/pgSQL语言已在所有数据库中注册。 PL/Python语言扩展已安装但未注册。
系统catalog
pg_language
记录有关当前安装的语言的信息。要使用过程语言创建函数,用户必须具有该语言的
USAGE
权限。 默认情况下,USAGE
被授予PUBLIC
(每个人)用于受信任的语言。如果需要,可以将其撤消。过程语言是各个数据库的本地语言。 您为单个数据库创建和删除语言。
如果服务器在
pg_pltemplate
中没有该语言的条目,则调用处理程序函数和验证器函数(如果有)必须已经存在。但是,当有一个条目时,函数就不必已经存在了。 如果数据库中不存在它们,它们将被自动定义。任何实现一种语言的共享库都必须位于SeaboxMPP数据库阵列中所有executor主机上的
LD_LIBRARY_PATH
位置中。 - 示例
-
创建任何标准过程语言的首选方法是使用
CREATE EXTENSION
而不是CREATE LANGUAGE
。 例如:CREATE EXTENSION plperl;
对于
pg_pltemplate
catalog中未知的语言:CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
- 兼容性说明
CREATE LANGUAGE
是SeaboxMPP数据库扩展。- 相关SQL命令
ALTER LANGUAGE
,CREATE EXTENSION
,CREATE FUNCTION
,DROP EXTENSION
,DROP LANGUAGE
,GRANT
DO