CREATE LANGUAGE — 定义一种新的过程语言
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
HANDLERcall_handler
[ INLINEinline_handler
] [ VALIDATORvalfunction
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
CREATE LANGUAGE
将一种新的过程语言注册到 PostgreSQL 数据库中。随后,可以在这种新语言中定义函数和过程。
CREATE LANGUAGE
实际上将语言名称与负责执行用该语言编写的函数的处理程序函数关联起来。有关语言处理程序的更多信息,请参阅第 58 章。
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
(请参阅 第 53.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 扩展。