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在Greenplum数据库中注册了新的过程语言。 随后,可以用这种新语言定义函数和触发过程。

Note: Greenplum数据库的过程语言已被制成“扩展名”, 因此应与CREATE EXTENSION一起安装,而不是CREATE LANGUAGE。 直接使用CREATE LANGUAGE应该仅限于扩展安装脚本。 如果数据库中存在“裸”语言(可能是升级的结果), 则可以使用CREATE EXTENSION langname FROM unpackaged将其转换为扩展名。

超级用户可以在Greenplum数据库中注册新语言。 数据库所有者还可以在该数据库中注册pg_pltemplate catalog中列出的tmpldbacreate字段为true的任何语言。 默认配置仅允许数据库所有者注册受信任的语言。 语言的创建者成为其所有者,以后可以将其删除,重命名或将所有权分配给新所有者。

CREATE OR REPLACE LANGUAGE将创建新语言或替换现有定义。 如果该语言已经存在,则其参数将根据pg_pltemplate中指定的值或从pg_pltemplate中获取的值进行更新, 但该语言的所有权和权限设置不会更改,并且假定使用该语言编写的任何现有函数仍然有效。 除了创建语言的正常特权要求外,用户还必须是现有语言的超级用户或所有者。 REPLACE情况主要用于确保该语言存在。 如果该语言具有pg_pltemplate条目,则REPLACE实际上不会更改有关现有定义的任何内容, 除非在异常情况下自创建该语言以来已对pg_pltemplate条目进行了修改。

CREATE LANGUAGE有效地将语言名称与处理程序函数关联,该处理函数负责执行以该语言编写的函数。 对于以过程语言(C或SQL以外的语言)编写的函数,数据库服务器没有有关如何解释函数源代码的内置知识。 该任务将传递给知道该语言详细信息的特殊处理程序。 处理程序可以执行解析,语法分析,执行等所有工作,也可以充当Greenplum数据库与编程语言的现有实现之间的桥梁。 处理程序本身是一种C语言函数,已编译为共享对象并按需加载,就像其他任何C函数一样。 这些过程语言程序包包含在标准的Greenplum数据库发行版中:PL/pgSQL,PL/Perl和PL/Python。 还为PL/Java和PL/R添加了语言处理程序,但是Greenplum数据库未预安装这些语言。 有关使用这些过程语言开发函数的更多信息,请参见PostgreSQL文档中有关过程语言的主题。

PL/Perl,PL/Java和PL/R库分别需要安装正确版本的Perl,Java和R。

CREATE LANGUAGE命令有两种形式。 在第一种形式中,用户指定所需语言的名称,Greenplum数据库服务器使用pg_pltemplate系统catalog来确定正确的参数。 在第二种形式中,用户指定语言参数以及语言名称。 您可以使用第二种形式来创建pg_pltemplate中未定义的语言。

当服务器在pg_pltemplate catalog中找到给定语言名称的条目时,即使命令包含语言参数,它也会使用catalog数据。 此行为简化了旧转储文件的加载,这些文件可能包含有关语言支持函数的过时信息。

参数

TRUSTED
TRUSTED指定该语言不会授予用户原本就不会访问的数据的访问权限。 如果在注册语言时省略此关键字,则只有具有Greenplum数据库超级用户特权的用户才能使用该语言创建新函数。
PROCEDURAL
这是一个干扰词。
name
新过程语言的名称。 该名称在数据库中的语言之间必须唯一。 包含对plpgsqlplperlplpythonu的内置支持。 默认情况下,在Greenplum数据库中已默认安装了语言plpgsql(PL/pgSQL)和plpythonu(PL/Python)。
HANDLER call_handler
如果服务器在pg_pltemplate中有用于指定语言名称的条目则忽略。 先前注册的函数的名称,将调用该函数来执行过程语言函数。 程序语言的调用处理程序必须使用编译后的语言编写, 例如使用版本1调用约定的C语言,并在Greenplum数据库中注册为不带任何参数的函数, 并返回language_handler类型,该仅是用于标识函数的占位符类型作为呼叫处理程序。
INLINE inline_handler
以前注册的函数的名称,该函数被调用以执行用DO命令创建的该语言的匿名代码块。 如果未指定inline_handler函数,则该语言不支持匿名代码块。 处理函数必须采用类型为internal的一个参数,即DO命令的内部表示形式。 该函数通常返回void。 处理程序的返回值将被忽略。
VALIDATOR valfunction
如果服务器在pg_pltemplate中有用于指定语言名称的条目则忽略。 先前注册的函数的名称,将调用该函数来执行过程语言函数。 程序语言的调用处理程序必须使用编译式语言编写, 例如使用版本1调用约定的C语言,并在Greenplum数据库中注册为不带任何参数的函数, 并返回language_handler类型,该仅是用于标识函数的占位符类型作为呼叫处理程序。

注解

默认情况下,PL/pgSQL语言已在所有数据库中注册。 PL/Python语言扩展已安装但未注册。

系统catalog pg_language记录有关当前安装的语言的信息。

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

过程语言是各个数据库的本地语言。 您为单个数据库创建和删除语言。

如果服务器在pg_pltemplate中没有该语言的条目,则调用处理程序函数和验证器函数(如果有)必须已经存在。 但是,当有一个条目时,函数就不必已经存在了。 如果数据库中不存在它们,它们将被自动定义。

任何实现一种语言的共享库都必须位于Greenplum数据库阵列中所有segment主机上的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是Greenplum数据库扩展。