pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE LANGUAGE — 定义一种新的过程语言
CREATE [ PROCEDURAL ] LANGUAGEnameCREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnameHANDLERcall_handler[ VALIDATORvalfunction]
使用CREATE LANGUAGE,PostgreSQL用户可以在PostgreSQL数据库中注册一种新的过程语言。随后,可以用这种新语言定义函数和触发器过程。
CREATE LANGUAGE实际上是将该语言名称与负责执行 用这种语言编写的函数的处理器函数关联起来。关于语言处理器的更多信息, 参见第 37 章。
CREATE LANGUAGE命令有两种形式。第一种形式中,用户只提供所需语言的名称,PostgreSQL服务器会查询pg_pltemplate系统目录,以确定正确的参数。第二种形式中,用户在提供语言名称的同时也提供语言参数。第二种形式可用来创建未在pg_pltemplate中定义的语言,但这种做法被认为已经过时。
当服务器在pg_pltemplate目录中找到给定语言名称的条目时,即使命令包含语言参数,也会使用目录中的数据。这种行为简化了旧转储文件的装载,因为它们很可能包含关于语言支持函数的过时信息。
通常,用户必须具有PostgreSQL超级用户权限才能注册新语言。不过,如果语言列在pg_pltemplate目录中,并且标记为允许数据库所有者创建(tmpldbacreate为真),数据库所有者就可以在该数据库中注册这种新语言。默认情况下,数据库所有者可以创建受信任的语言,但超级用户可以通过修改pg_pltemplate的内容来调整这一点。语言的创建者成为其所有者,以后可以删除它、重命名它或将它分配给新的所有者。
TRUSTEDTRUSTED指定该语言的调用处理器是安全的,也就是说,它不会让非特权用户获得任何绕过访问限制的功能。如果在注册该语言时省略这个关键字,只有拥有PostgreSQL超级用户权限的用户才能使用该语言创建新函数。
PROCEDURAL这是一个噪声词。
name新过程语言的名称。语言名称不区分大小写。该名称必须在与数据库中的其他语言名称不同。
为了向后兼容,名称可以用单引号括起来。
HANDLER call_handlercall_handler 是一个先前注册的函数名称,它会被调用来执行该过程语言中的函数。 过程语言的调用处理器必须使用某种编译型语言(例如 C)编写,并采用 版本 1 调用约定。它必须在PostgreSQL 中注册为一个不带参数且返回language_handler类型的 函数。该返回类型是一种占位符类型,仅用于把 该函数标识为调用处理器。
VALIDATOR valfunctionvalfunction 是一个先前注册的函数名称,在创建该语言中的新函数时会调用它来验证 该新函数。如果没有指定验证器函数,那么新函数在创建时不会被检查。 验证器函数必须接受一个oid类型的参数,它将是待创建 函数的 OID,并且它通常返回void。
验证器函数通常会检查函数体的语法正确性,但它也可以检查函数的其他 属性,例如该语言是否支持某些参数类型。要报告错误,验证器函数 应使用ereport()函数。函数的返回值会被忽略。
TRUSTED选项和支持函数名称会被忽略,前提是服务器在pg_pltemplate中有指定语言名称的条目。
createlang程序是对CREATE LANGUAGE命令的一个简单包装。它使从 shell 命令行安装过程语言变得更加容易。
使用DROP LANGUAGE删除过程语言,或者更好的方法是使用droplang程序。
系统目录pg_language(见第 44.21 节)记录当前已安装语言的信息。此外, createlang有一个可以列出已安装语言的选项。
要用某种过程语言创建函数,用户必须拥有该语言的 USAGE权限。默认情况下,对于受信任的语言, USAGE会授予PUBLIC(即所有人)。 如果需要,也可以撤销这项授权。
过程语言是各个数据库本地的。不过,可以将某种语言安装到 template1数据库中,这样它就会在之后创建的所有 数据库中自动可用。
如果服务器在pg_pltemplate中没有该语言的条目,则调用处理器函数和验证器函数(如果有)必须已经存在。但如果有条目,则这些函数不必事先存在;如果数据库中不存在它们,就会自动定义它们。(如果安装中没有实现该语言的共享库,这可能导致CREATE LANGUAGE失败。)
在 7.3 之前的PostgreSQL版本中,必须将处理器函数声明为返回占位符类型opaque,而不是language_handler。为了支持装载旧转储文件,CREATE LANGUAGE会接受声明为返回opaque的函数,但会发出提示,并将函数声明的返回类型改为language_handler。
创建任何标准过程语言的首选方式很简单:
CREATE LANGUAGE plpgsql;
对于 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扩展。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。