CREATE LANGUAGE — 定义一个新的过程语言
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnameHANDLERcall_handler[ INLINEinline_handler] [ VALIDATORvalfunction] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEname
CREATE LANGUAGE 将一个新的过程语言注册到一个 PostgreSQL 数据库。之后,就可以用这种新语言定义函数和过程了。
CREATE LANGUAGE 有效地将语言名称与负责执行以该语言编写的函数的处理函数关联起来。有关语言处理程序的更多信息,请参阅 第 57 章。
CREATE OR REPLACE LANGUAGE 将会创建一种新语言,或者替换一个现有的定义。如果该语言已存在,则根据命令更新其参数,但语言的所有权和权限设置不会改变,并且假定该语言中已有的所有函数仍然有效。
必须拥有 PostgreSQL 超级用户权限才能注册新语言或更改现有语言的参数。但是,一旦创建了该语言,就可以将其所有权分配给非超级用户,该非超级用户随后可以删除它、更改其权限、重命名它或将其分配给新所有者。(但不要将底层 C 函数的所有权分配给非超级用户;这会为该用户创建一个特权升级途径。)
不提供任何处理函数的 CREATE LANGUAGE 形式已过时。为了向后兼容旧的转储文件,它被解释为 CREATE EXTENSION。如果该语言已打包成同名的扩展,那么这会起作用,这也是设置过程语言的常规方法。
TRUSTEDTRUSTED 指定该语言不授予用户原本无法访问的数据的访问权限。如果在注册语言时省略此关键字,则只有拥有 PostgreSQL 超级用户权限的用户才能使用该语言创建新函数。
PROCEDURAL这是一个噪声词。
name新过程语言的名称。该名称在数据库中的语言之间必须是唯一的。
HANDLER call_handlercall_handler 是一个先前已注册的函数,该函数将被调用来执行该过程语言的函数。过程语言的调用处理程序必须用编译型语言(如 C)编写,并使用版本 1 调用约定,并向 PostgreSQL 注册为一个不接受参数且返回 language_handler 类型的函数。`language_handler` 是一个占位符类型,仅用于标识该函数为调用处理程序。
INLINE inline_handlerinline_handler 是一个先前已注册的函数,该函数将被调用来执行该语言中的匿名代码块(DO 命令)。如果未指定 inline_handler 函数,则该语言不支持匿名代码块。处理函数必须接受一个 internal 类型的参数,该参数将是 DO 命令的内部表示形式,并且通常返回 void。处理函数的返回值将被忽略。
VALIDATOR valfunctionvalfunction 是一个先前已注册的函数,当创建该语言的新函数时,该函数将被调用来验证新函数。如果未指定验证器函数,则在创建新函数时不会对其进行检查。验证器函数必须接受一个 oid 类型的参数,该参数将是要创建函数的 OID,并且通常返回 void。
验证器函数通常会检查函数体是否存在语法错误,但它也可以检查函数的其他属性,例如该语言是否无法处理某些参数类型。要发出错误信号,验证器函数应使用 ereport() 函数。该函数的返回值将被忽略。
使用 DROP LANGUAGE 来删除过程语言。
系统目录 pg_language(请参阅 第 52.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 扩展。