Postgresql 中文操作指南

CREATE LANGUAGE

CREATE LANGUAGE——定义新的过程语言

Synopsis

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

Description

CREATE LANGUAGE 使用 PostgreSQL 数据库注册新的过程语言。随后,可以用这种新语言定义函数和过程。

CREATE LANGUAGE 实际上将语言名称与负责执行用该语言编写的函数的处理程序函数关联起来。有关语言处理程序的更多信息,请参考 Chapter 58

CREATE OR REPLACE LANGUAGE 将创建一种新语言或替换现有定义。如果语言已存在,那么它的参数将根据命令进行更新,但语言的所有权和权限设置不会更改,并且假设用该语言编写的任何现有函数仍然有效。

必须具有 PostgreSQL 超级用户权限才能注册新语言或更改现有语言的参数。但是,一旦创建了语言,就有权将其所有权分配给非超级用户,而后者可以将其删除、更改其权限、重命名或将其分配给新所有者。(但是,不要将基础 C 函数的所有权分配给非超级用户;这会为该用户创建权限升级路径。)

不提供任何处理程序函数的 CREATE LANGUAGE 形式已过时。为了与旧转储文件保持向后兼容性,它被解释为 CREATE EXTENSION 。如果已将语言打包到同名的扩展中,那么这种方式将会奏效,这是设置过程语言的传统方法。

Parameters

  • TRUSTED

    • TRUSTED 指定语言不会授予用户访问他们原本没有的数据。如果在注册语言时省略了此关键词,那么只有拥有 PostgreSQL 超级用户权限的用户才能使用此语言创建新函数。

  • PROCEDURAL

    • 这是一个干扰词。

  • name

    • 新过程语言的名称。该名称在数据库中的语言之间必须是唯一的。

  • HANDLER call_handler

    • call_handler 是先前已注册的函数的名称,该函数将被调用来执行过程语言的函数。过程语言的调用处理程序必须使用 C 这样的已编译语言(采用第 1 版调用惯例)编写,并使用不采用任何参数并返回 language_handler 类型的函数在 PostgreSQL 中进行注册, language_handler 是一种占位符类型,仅用于将该函数标识为调用处理程序。

  • INLINE inline_handler

    • inline_handler 是先前已注册的函数的名称,该函数将被调用来执行此语言中的匿名代码块( DO 命令)。如果没有指定 inline_handler 函数,那么该语言不支持匿名代码块。处理程序函数必须采用类型为 internal 的一个参数,该参数将会是 DO 命令的内部表示形式,它通常将返回 void 。处理程序的返回值将被忽略。

  • VALIDATOR valfunction

    • valfunction 是先前已注册的函数的名称,该函数将在该语言中的新函数创建时被调用,以验证该新函数。如果没有指定验证函数,那么当创建一个新的函数时将不会对其进行检查。验证函数必须采用类型为 oid 的一个参数,该参数将是要创建函数的 OID,并且通常会返回 void

    • 验证器函数通常会检查函数体语法是否正确,但它也可以查看函数的其他属性,例如,如果语言无法处理某些参数类型。为了发出错误信号,验证器函数应使用 ` ereport() ` 函数。该函数的返回值会被忽略。

Notes

使用 ` DROP LANGUAGE ` 放弃过程语言。

系统目录 ` pg_language `(请参阅 ` Section 53.29 `)记录有关当前已安装语言的信息。此外,psql 命令 ` \dL ` 列出已安装的语言。

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

过程语言属于各个数据库的本地语言。但是,可以将语言安装到 ` template1 ` 数据库中,这将导致它自动在所有随后创建的数据库中可用。

Examples

创建新过程语言的最小顺序如下:

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

通常将它编写在扩展的创建脚本中,用户可以这样做来安装扩展:

CREATE EXTENSION plsample;

Compatibility

` CREATE LANGUAGE ` 是一个 PostgreSQL 扩展。