2024 年 9 月 26 日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

CREATE LANGUAGE

CREATE LANGUAGE — 定义新的过程语言

概要

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

描述

CREATE LANGUAGEPostgreSQL 数据库中注册新的过程语言。随后,可以在此新的语言中定义函数和过程。

CREATE LANGUAGE 有效地将语言名称与处理函数相关联,这些函数负责执行用该语言编写的函数。有关语言处理程序的更多信息,请参阅 第 56 章

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

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

不提供任何处理函数的 CREATE LANGUAGE 形式已过时。为了与旧的转储文件向后兼容,它被解释为 CREATE EXTENSION。如果该语言已打包到同名扩展中,这将起作用,这是设置过程语言的常规方法。

参数

TRUSTED

TRUSTED 指定该语言不会授予用户本来没有的数据访问权限。如果在注册语言时省略此关键字,则只有具有 PostgreSQL 超级用户特权的用户可以使用此语言创建新函数。

PROCEDURAL

这是一个噪音词。

name

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

HANDLER call_handler

call_handler 是先前注册的函数的名称,将调用该函数来执行过程语言的函数。过程语言的调用处理程序必须用 C 等编译语言(版本 1 调用约定)编写,并作为不带参数且返回值为 language_handler 类型的函数注册到 PostgreSQL 中,这是一个仅用于识别该函数为调用处理程序的占位符类型。

INLINE inline_handler

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

VALIDATOR valfunction

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

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

注意

使用 DROP LANGUAGE 来删除过程语言。

系统目录 pg_language(见 第 51.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 LANGUAGEPostgreSQL 扩展。

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。