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
新过程语言的名称。
该名称在数据库中的语言之间必须唯一。
包含对plpgsql
,plperl
和plpythonu
的内置支持。
默认情况下,在Greenplum数据库中已默认安装了语言plpgsql
(PL/pgSQL)和plpythonu
(PL/Python)。
HANDLER call_handler
如果服务器在pg_pltemplate
中有用于指定语言名称的条目则忽略。
先前注册的函数的名称,将调用该函数来执行过程语言函数。
程序语言的调用处理程序必须使用编译后的语言编写,
例如使用版本1调用约定的C语言,并在Greenplum数据库中注册为不带任何参数的函数,
并返回language_handler
类型,该仅是用于标识函数的占位符类型作为呼叫处理程序。
INLINE inline_handler
以前注册的函数的名称,该函数被调用以执行用[DO](DO.html#topic1)
命令创建的该语言的匿名代码块。
如果未指定inline_handler
函数,则该语言不支持匿名代码块。
处理函数必须采用类型为internal
的一个参数,即[DO](DO.html#topic1)
命令的内部表示形式。
该函数通常返回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数据库扩展。
另见
[ALTER LANGUAGE](ALTER_LANGUAGE.html#topic1)
,
[CREATE EXTENSION](CREATE_EXTENSION.html)
, [CREATE FUNCTION](CREATE_FUNCTION.html#topic1)
, [DROP EXTENSION](DROP_EXTENSION.html#topic1)
, [DROP LANGUAGE](DROP_LANGUAGE.html#topic1)
,
[GRANT](GRANT.html#topic1)
[DO](DO.html#topic1)
Parent topic: SQL Command Reference