# 创造语言

创建语言-定义新的过程语言

# 提要

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

# 描述

创造语言在PostgreSQL数据库中注册新的过程语言。随后,可以用这种新语言定义函数和过程。

创造语言有效地将语言名称与负责执行用该语言编写的函数的处理程序函数相关联。提到第56章有关语言处理程序的更多信息。

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

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

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

# 参数

可信的

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

程序性

这是一个噪音词。

名称

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

处理者 打电话给_handler

*打电话给_handler*是以前注册的函数的名称,该函数将被调用以执行过程语言的函数。过程语言的调用处理程序必须使用编译语言(如C)编写,具有版本1调用约定,并在PostgreSQL中注册为不带参数并返回语言处理器类型,一种占位符类型,仅用于将函数标识为调用处理程序。

内联 内联处理器

*内联处理器以前注册的函数的名称,该函数将被调用以执行匿名代码块(命令)用这种语言。如果没有内联处理器*函数,则该语言不支持匿名代码块。处理函数必须采用一个类型为的参数内部的,这将是命令的内部表示形式,它通常会返回无效的。将忽略处理程序的返回值。

验证器 valfunction

*valfunction*是以前注册的函数的名称,在语言中创建新函数时将调用该函数,以验证新函数。如果未指定验证器函数,则在创建新函数时不会检查它。验证器函数必须接受一个类型为的参数老年人,它将是待创建函数的OID,通常会返回无效的.

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

# 笔记

使用放弃语言放弃过程语言。

系统目录pg_语言(见第52.29节)记录有关当前安装的语言的信息。另外,psql命令\dL列出已安装的语言。

要用过程语言创建函数,用户必须具有用法语言的特权。默认情况下,用法被授予平民的(即,所有人)使用受信任的语言。如果需要,可以撤销。

过程语言是单个数据库的本地语言。但是,可以将一种语言安装到模板1数据库,这将使它在随后创建的所有数据库中自动可用。

# 例子

创建新程序语言的最小顺序是:

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

这通常会写入扩展的创建脚本中,用户会这样做来安装扩展:

CREATE EXTENSION plsample;

# 兼容性

创造语言是一个PostgreSQL扩展。

# 另见

改变语言, 创建函数, 放弃语言, 授予, 撤销