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