↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 8.1 已结束支持。 请参阅 当前版本手册.

CREATE LANGUAGE

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

大纲

CREATE [ PROCEDURAL ] LANGUAGE name
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ VALIDATOR valfunction ]

描述

使用CREATE LANGUAGE,PostgreSQL用户可以在PostgreSQL数据库中注册一种新的过程语言。随后,可以用这种新语言定义函数和触发器过程。用户必须具有PostgreSQL超级用户权限才能注册新语言。

CREATE LANGUAGE实际上是将该语言名称与负责执行用这种语言编写的函数的处理器函数关联起来。关于语言处理器的更多信息,参见第 35 章。

CREATE LANGUAGE命令有两种形式。第一种形式中,用户只提供所需语言的名称,PostgreSQL服务器会查询pg_pltemplate系统目录,以确定正确的参数。第二种形式中,用户在提供语言名称的同时也提供语言参数。第二种形式可用来创建未在pg_pltemplate中定义的语言,但这种做法被认为已经过时。

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

参数

TRUSTED

TRUSTED指定该语言的调用处理器是安全的,也就是说,它不会让非特权用户获得任何绕过访问限制的功能。如果在注册该语言时省略这个关键字,只有拥有PostgreSQL超级用户权限的用户才能使用该语言创建新函数。

PROCEDURAL

这是一个噪声词。

name

新过程语言的名称。语言名称不区分大小写。该名称必须在与数据库中的其他语言名称不同。

为了向后兼容,名称可以用单引号括起来。

HANDLER call_handler

call_handler 是一个先前注册的函数名称,它会被调用来执行该过程语言中的函数。过程语言的调用处理器必须使用某种编译型语言(例如 C)编写,并采用版本 1 调用约定。它必须在PostgreSQL 中注册为一个不带参数且返回language_handler类型的函数。该返回类型是一种占位符类型,仅用于把该函数标识为调用处理器。

VALIDATOR valfunction

valfunction 是一个先前注册的函数名称,在创建该语言中的新函数时会调用它来验证该新函数。如果没有指定验证器函数,那么新函数在创建时不会被检查。验证器函数必须接受一个oid类型的参数,它将是待创建函数的 OID,并且它通常返回void。

验证器函数通常会检查函数体的语法正确性,但它也可以检查函数的其他属性,例如该语言是否支持某些参数类型。要报告错误,验证器函数应使用ereport()函数。函数的返回值会被忽略。

TRUSTED选项和支持函数名称会被忽略,前提是服务器在pg_pltemplate中有指定语言名称的条目。

注解

createlang程序是对CREATE LANGUAGE命令的一个简单包装。它使从 shell 命令行安装过程语言变得更加容易。

使用DROP LANGUAGE删除过程语言,或者更好的方法是使用droplang程序。

系统目录pg_language(见第 42.20 节)记录当前已安装语言的信息。此外,createlang有一个可以列出已安装语言的选项。

要用某种过程语言创建函数,用户必须拥有该语言的 USAGE权限。默认情况下,对于受信任的语言,USAGE会授予PUBLIC(即所有人)。如果需要,也可以撤销这项授权。

过程语言是各个数据库本地的。不过,可以将某种语言安装到 template1数据库中,这样它就会在之后创建的所有数据库中自动可用。

如果服务器在pg_pltemplate中没有该语言的条目,则调用处理器函数和验证器函数(如果有)必须已经存在。但如果有条目,则这些函数不必事先存在;如果数据库中不存在它们,就会自动定义它们。(如果安装中没有实现该语言的共享库,这可能导致CREATE LANGUAGE失败。)

在 7.3 之前的PostgreSQL版本中,必须将处理器函数声明为返回占位符类型opaque,而不是language_handler。为了支持装载旧转储文件,CREATE LANGUAGE会接受声明为返回opaque的函数,但会发出提示,并将函数声明的返回类型改为language_handler。

示例

创建任何标准过程语言的首选方式很简单:

CREATE LANGUAGE 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是一种 PostgreSQL扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.