pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE LANGUAGE — 定义一种新的过程语言
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGElangnameHANDLERcall_handler
使用CREATE LANGUAGE, PostgreSQL用户可以在 PostgreSQL数据库中注册一种新的过程语言。随后,就可以用这种新语言定义函数和触发器过程。注册新语言的用户必须拥有 PostgreSQL超级用户权限。
CREATE LANGUAGE实际上把语言名称与一个负责执行以该语言编写的函数的调用处理器关联起来。关于语言调用处理器的更多信息,请参考Programmer's Guide。
注意,过程语言是每个数据库局部的。要让一种语言默认在所有数据库中可用,应该把它安装进template1数据库。
TRUSTEDTRUSTED指定该语言的调用处理器是安全的,也就是说,它不会为无特权用户提供任何绕过访问限制的功能。如果注册语言时省略该关键字,则只有拥有 PostgreSQL超级用户权限的用户能用这种语言创建新函数。
PROCEDURAL这是一个噪声词。
langname新过程语言的名称。语言名不区分大小写。过程语言不能覆盖 PostgreSQL的内建语言之一。
为了向后兼容,该名称可以用单引号包围。
HANDLER call_handlercall_handler是一个先前已注册函数的名称,该函数将被调用来执行过程语言函数。过程语言的调用处理器必须用 C 之类的编译语言以版本 1 调用约定编写,并作为不带参数、返回 opaque类型的函数注册到 PostgreSQL中,这个类型是为未指定或未定义类型准备的占位类型。
CREATE
如果语言成功创建,就返回此消息。
ERROR: PL handler function funcname() doesn't exist
如果找不到函数 funcname(),就返回此错误。
通常用户不应直接执行这条命令。对于 PostgreSQL发行版本中提供的过程语言,应该使用createlang脚本,它还会安装正确的调用处理器。(createlang会在内部调用CREATE LANGUAGE。)
使用CREATE FUNCTION命令创建新函数。
使用DROP LANGUAGE,或者更好的是droplang脚本,来删除过程语言。
系统目录pg_language记录当前已安装过程语言的信息。
Table "pg_language"
Attribute | Type | Modifier
---------------+---------+----------
lanname | name |
lanispl | boolean |
lanpltrusted | boolean |
lanplcallfoid | oid |
lancompiler | text |
lanname | lanispl | lanpltrusted | lanplcallfoid | lancompiler
-------------+---------+--------------+---------------+-------------
internal | f | f | 0 | n/a
C | f | f | 0 | /bin/cc
sql | f | f | 0 | postgres
目前,过程语言的定义一旦创建就不能更改。
依次执行下面两条命令将注册一种新的过程语言及相关的调用处理器。
CREATE FUNCTION plsample_call_handler () RETURNS opaque
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
CREATE LANGUAGE是 PostgreSQL扩展。
CREATE LANGUAGE命令最早出现在 PostgreSQL 6.3 中。
createlang, CREATE FUNCTION, droplang, DROP LANGUAGE, PostgreSQL 程序员指南
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。