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 扩展。
如果您在文档中发现任何不正确、与您在特定功能方面的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。