CREATE LANGUAGE

定义一种新的过程化语言。

概要

CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE <name>

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE <name>
    HANDLER <call_handler>
   [ INLINE <inline_handler> ] 
   [ VALIDATOR <valfunction> ]

描述

CREATE LANGUAGE 命令用于向数据库注册一种新的过程语言。注册完成后,即可在此新语言中定义函数和过程。

注意! 数据库的程序化语言已被归类为"扩展",因此应通过CREATE EXTENSION命令安装,而非CREATE LANGUAGE。直接使用CREATE LANGUAGE应仅限于扩展安装脚本中。若数据库中存在"裸语言"(可能是升级操作导致),可通过CREATE EXTENSION <langname> FROM unpackaged将其转换为扩展。

CREATE LANGUAGE 命令将语言名称与负责执行该语言编写函数的处理程序函数关联起来。

CREATE LANGUAGE 命令有两种形式。第一种形式中,用户仅需提供所需语言的名称,数据库服务器将通过查询 pg_pltemplate 系统目录来确定正确参数。第二种形式中,用户需同时提供语言名称及相关参数。此形式可用于创建未在 pg_pltemplate 中定义的语言,但该方法已被视为过时。

当服务器在 pg_pltemplate 目录中找到指定语言名称的条目时,即使命令包含语言参数,它也会使用目录数据。这种行为简化了旧转储文件的加载过程,因为这些文件可能包含过时的语言支持函数信息。

通常情况下,用户必须拥有数据库超级用户权限才能注册新语言。但若该语言已在pg_pltemplate目录中列出,且被标记为允许数据库所有者创建(即tmpldbacreate为true),则数据库所有者可在其数据库内注册新语言。默认情况下,受信任语言可由数据库所有者创建,但超级用户可通过修改 pg_pltemplate 内容调整此权限。语言创建者自动成为其所有者,后续可执行删除、重命名或移交所有权操作。

CREATE OR REPLACE LANGUAGE 语句将创建新语言或替换现有定义。若语言已存在,其参数将根据指定值或从 pg_pltemplate 获取的值更新,但语言的所有权和权限设置保持不变,且用该语言编写的现有函数仍被视为有效。除创建语言的常规权限要求外,用户必须是超级用户或现有语言的所有者。REPLACE 模式主要用于确保语言存在。若语言已有 pg_pltemplate 条目,则 REPLACE 不会实际修改现有定义——除非出现特殊情况:即语言创建后 pg_pltemplate 条目曾被修改。

参数

  • TRUSTED
    • TRUSTED 指定该语言不会授予用户本无权访问的数据权限。若在注册语言时省略此关键字,则仅拥有数据库超级用户权限的用户才能使用该语言创建新函数。
  • PROCEDURAL
    • 这是一个噪音词。
  • name
    • 新过程化语言的名称。该名称在 YMatrix 中的所有语言中必须唯一。
    • 为保持向后兼容性,名称可使用单引号括起。
  • HANDLER call_handler
    • 先前注册的函数名称,该函数将被调用以运行过程化语言的函数。过程化语言的调用处理程序必须使用C等编译型语言编写,采用版本1调用约定,并向数据库注册为不带参数且返回language_handler类型的函数——该占位符类型仅用于标识该函数为调用处理程序。
  • INLINE inline_handler
    • 在该语言中,用于调用先前注册的函数来运行匿名代码块的名称,该代码块通过DO命令创建。若未指定inline_handler函数,则该语言不支持匿名代码块。处理函数必须接受一个内部类型的参数,该参数是DO命令的内部表示形式。该函数通常返回void类型,且其返回值将被忽略。
  • VALIDATOR valfunction
    • 当语言中创建新函数时调用的、用于验证该新函数的预先注册函数名称。若未指定验证函数,则数据库在创建新函数时不会进行检查。验证函数必须接受一个类型为 oid 的参数,该参数即为待创建函数的 OID,通常返回 void。
    • 验证函数通常会检查函数主体的语法正确性,但也可检查函数的其他属性,例如当语言无法处理特定参数类型时。为标记错误,验证函数应使用ereport()函数。该函数的返回值将被忽略。

      注意! 如果服务器在 pg_pltemplate 中已存在指定语言名称的条目,则会忽略 TRUSTED 选项及支持函数名称。

注意

使用 DROP LANGUAGE 删除过程语言。

系统目录 pg_language 记录当前安装语言的信息。此外,psql 命令 \dL 可列出已安装的语言。

要在过程化语言中创建函数,用户必须拥有该语言的USAGE权限。默认情况下,受信任语言的USAGE权限授予PUBLIC(所有人)。如有需要,可撤销该权限。

过程语言属于单个数据库的本地资源。但若将语言安装至模板数据库(template1),则该语言将自动在后续创建的所有数据库中生效。

若服务器未在pg_pltemplate中为该语言创建条目,则调用处理函数、内联处理函数(若有)及验证函数(若有)必须预先存在。但若已存在条目,则无需预先定义这些函数;若数据库中不存在,它们将被自动定义。(若实现该语言的共享库在安装环境中不可用,这可能导致CREATE LANGUAGE命令失败。)

示例

创建任何标准过程化语言的首选方式是使用 CREATE EXTENSION 而不是 CREATE LANGUAGE。例如:

CREATE EXTENSION plperl;

对于在 pg_pltemplate 目录中未知的语言,需要使用如下序列:

CREATE FUNCTION plsample_call_handler() RETURNS 
language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

兼容性

CREATE LANGUAGE 是一个数据库扩展。

另见

ALTER LANGUAGE, CREATE EXTENSION, CREATE FUNCTION, DROP LANGUAGE, GRANT, DO