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
是先前注册的函数的名称,将调用该函数来执行过程语言的函数。过程语言的调用处理程序必须用 C 等编译语言(版本 1 调用约定)编写,并作为不带参数且返回值为 language_handler
类型的函数注册到 PostgreSQL 中,这是一个仅用于识别该函数为调用处理程序的占位符类型。
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 扩展。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。