CREATE LANGUAGE — 定义一种新的过程语言
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGEnameCREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnameHANDLERcall_handler[ INLINEinline_handler] [ VALIDATORvalfunction]
CREATE LANGUAGE在PostgreSQL数据库中注册一种新的过程语言。随后,可以用这种新语言定义函数和触发器过程。
从PostgreSQL 9.1 开始,大多数过程语言都已变成“扩展”,因此应使用CREATE EXTENSION而不是CREATE LANGUAGE来安装。现在直接使用CREATE LANGUAGE应仅限于扩展安装脚本。如果数据库中有一个“裸”语言(例如升级的结果),可以使用CREATE EXTENSION 将其转换为扩展。langname FROM unpackaged
CREATE LANGUAGE实际上是将该语言名称与负责执行 用这种语言编写的函数的处理器函数关联起来。关于语言处理器的更多信息, 参见Chapter 55。
CREATE LANGUAGE命令有两种形式。第一种形式中,用户只提供所需语言的名称,PostgreSQL服务器会查询pg_pltemplate系统目录,以确定正确的参数。第二种形式中,用户在提供语言名称的同时也提供语言参数。第二种形式可用来创建未在pg_pltemplate中定义的语言,但这种做法被认为已经过时。
当服务器在pg_pltemplate目录中找到给定语言名称的条目时,即使命令包含语言参数,也会使用目录中的数据。这种行为简化了旧转储文件的装载,因为它们很可能包含关于语言支持函数的过时信息。
通常,用户必须具有PostgreSQL超级用户权限才能注册新语言。不过,如果语言列在pg_pltemplate目录中,并且标记为允许数据库所有者创建(tmpldbacreate为 true),数据库所有者就可以在该数据库中注册这种新语言。默认情况下,数据库所有者可以创建受信任的语言,但超级用户可以通过修改pg_pltemplate的内容来调整这一点。语言的创建者成为其所有者,以后可以删除它、重命名它或将它分配给新的所有者。
CREATE OR REPLACE LANGUAGE会创建新语言,或替换现有定义。如果语言已经存在,则会根据指定值或从pg_pltemplate获取的值更新其参数,但不会改变语言的所有权和权限设置,并且假定用该语言编写的任何现有函数仍然有效。除了满足创建语言的常规权限要求外,用户还必须是超级用户或现有语言的所有者。REPLACE主要用于确保语言存在。如果语言具有pg_pltemplate条目,则REPLACE实际上不会改变现有定义的任何内容,除非出现少见的情况:该pg_pltemplate条目在语言创建后被修改过。
TRUSTEDTRUSTED指定该语言不会让用户获得其原本 无权访问的数据访问能力。如果在注册该语言时省略这个关键字,只有 拥有PostgreSQL超级用户权限的用户 才能使用该语言创建新函数。
PROCEDURAL这是一个噪声词。
name新过程语言的名称。该名称在数据库内必须唯一。
为了向后兼容,名称可以用单引号括起来。
HANDLER call_handlercall_handler 是一个先前注册的函数名称,它会被调用来执行该过程语言中的函数。 过程语言的调用处理器必须使用某种编译型语言(例如 C)编写,并采用 版本 1 调用约定。它必须在PostgreSQL 中注册为一个不带参数且返回language_handler类型的 函数。该返回类型是一种占位符类型,仅用于把 该函数标识为调用处理器。
INLINE inline_handlerinline_handler 是一个先前注册的函数名称,它会被调用来执行该语言中的匿名代码块 (DO命令)。 如果没有指定inline_handler 函数,则该语言不支持匿名代码块。该处理器函数必须接受一个 internal类型的参数,该参数将是 DO命令的内部表示,并且它通常返回 void。处理器的返回值会被忽略。
VALIDATOR valfunctionvalfunction 是一个先前注册的函数名称,在创建该语言中的新函数时会调用它来验证 该新函数。如果没有指定验证器函数,那么新函数在创建时不会被检查。 验证器函数必须接受一个oid类型的参数,它将是待创建 函数的 OID,并且它通常返回void。
验证器函数通常会检查函数体的语法正确性,但它也可以检查函数的其他 属性,例如该语言是否支持某些参数类型。要报告错误,验证器函数 应使用ereport()函数。函数的返回值会被忽略。
TRUSTED选项和支持函数名称会被忽略,前提是服务器在pg_pltemplate中有指定语言名称的条目。
使用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。
创建任何标准过程语言的首选方式很简单:
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;
CREATE LANGUAGE是一种 PostgreSQL扩展。