CREATE LANGUAGE — 定义新的过程性语言
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
CREATE LANGUAGE
负责使用 PostgreSQL 数据库注册一种新的过程语言。随后可以在这种语言中定义函数和过程。
CREATE LANGUAGE
实际上将语言名称与负责执行使用该语言编写的函数的处理程序函数相关联。有关语言处理程序的更多信息,请参阅 第 56 章。
CREATE OR REPLACE LANGUAGE
将创建一个新的语言或替换现有的定义。如果该语言已存在,其参数将根据该命令进行更新,但语言的所有权和权限设置不会更改,并且假定使用该语言编写的任何现有函数仍然有效。
用户必须拥有 PostgreSQL 超级用户权限才能注册新语言或更改现有语言的参数。但是,一旦创建了该语言,就可以将该语言的所有权分配给非超级用户,然后该用户可以删除该语言、更改其权限、重命名该语言或将其分配给新所有者。(但是,不要将底层 C 函数的所有权分配给非超级用户;这样会为该用户创建一个权限升级路径。)
不提供任何处理程序函数的 CREATE LANGUAGE
形式已弃用。为与旧转储文件保持向后兼容性,它被解释为 CREATE EXTENSION
。如果该语言已打包到同名扩展中,该扩展是设置过程语言的常规方式,则此方法可用。
TRUSTED
TRUSTED
指定该语言不会授予用户原本没有的数据访问权限。如果注册该语言时省略了此关键词,只有具有 PostgreSQL 超级用户权限的用户才能使用该语言创建新函数。
PROCEDURAL
这是一个干扰词。
name
新处理语言的名称。该名称在数据库中的语言中必须是唯一的。
HANDLER
call_handler
call_handler
是先前注册的函数的名称,系统将调用该函数执行处理语言的函数。处理语言的调用处理程序必须使用编译语言(如带版本 1 调用约定的 C 语言)编写,并使用 PostgreSQL 注册为一个不接受任何参数并返回 language_handler
类型的函数,这是一种占位符类型,仅用于将该函数标识为调用处理程序。
INLINE
inline_handler
inline_handler
为先前注册函数的名称,该函数在该语言中将被调用以执行一个匿名代码块 (DO
命令)。如果未指定 inline_handler
函数,语言将不支持匿名代码块。该处理函数必须摄取一个 internal
类型参数,该参数将是 DO
命令的内部表示,并且通常会返回 void
。处理程序的返回值会被忽略。
VALIDATOR
valfunction
valfunction
为先前注册函数的名称,当语言中创建了一个新函数时,会调用该函数来验证新函数。如果未指定验证函数,则在创建新函数时将不检查它。该验证函数必须摄取一个 oid
类型参数,该参数将成为即将创建的函数的 OID,并且通常会返回 void
。
验证函数通常会针对语法正确性检查函数主体,但它还可以查看函数的其他属性,例如语言是否无法处理某些参数类型。要发出错误信号,验证函数应使用 ereport()
函数。该函数的返回值会被忽略。
使用 DROP LANGUAGE
删除过程语言。
系统目录 pg_language
(请参阅 第 51.29 节)记录了有关当前已安装语言的信息。此外,psql 命令 \dL
列出已安装语言。
要使用过程语言创建函数,用户须具有语言的 USAGE
权限。默认情况下,USAGE
权限被授予 PUBLIC
(即所有人)以用于受信任的语言。如有需要可撤销此权限。
过程语言是特定于各个数据库的。但是,可以将语言安装到 template1
数据库中,这会使其在随后创建的所有数据库中自动可用。
用于创建新的过程语言的最短顺序为
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
通常会在扩展创建脚本中写入这一脚本,并且用户会执行此操作以安装扩展
CREATE EXTENSION plsample;
CREATE LANGUAGE
是一个 PostgreSQL 扩展。