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

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
历史版本。 PostgreSQL 7.3 已结束支持。 请参阅 当前版本手册.

第 21 章 PL/Perl - Perl 过程语言

PL/Perl 是一种可装载的过程语言,使你能够用 Perl 编程语言编写 PostgreSQL 函数。

要在某个特定数据库中安装 PL/Perl,使用 createlang plperl dbname。

提示

如果把某种语言安装到template1中,之后创建的所有数据库都会自动安装该语言。

注意

源码包的用户必须在安装过程中专门启用 PL/Perl 的构建(更多信息请参阅安装说明)。二进制包的用户可能会在单独的子包中找到 PL/Perl。

21.1. PL/Perl 函数和参数 #

要用 PL/Perl 语言创建函数,使用标准的语法:

CREATE FUNCTION funcname (argument-types) RETURNS return-type AS '
    # PL/Perl function body
' LANGUAGE plperl;

函数体是普通的 Perl 代码。

参数和结果的处理与任何其他 Perl 子例程一样:参数通过 @_ 传入,结果值用 return 或作为函数中最后求值的表达式返回。例如,一个返回两个整数值中较大者的函数可以这样定义:

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS '
    if ($_[0] > $_[1]) { return $_[0]; }
    return $_[1];
' LANGUAGE plperl;

如果 SQL 空值被传给函数,参数值在 Perl 中将显示为“未定义”。另一种做法是在函数体内检查未定义的输入。例如,假设我们希望 perl_max 在一个参数为空、另一个非空时返回非空的那个参数,而不是返回空值:

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS '
    my ($a,$b) = @_;
    if (! defined $a) {
        if (! defined $b) { return undef; }
        return $b;
    }
    if (! defined $b) { return $a; }
    if ($a > $b) { return $a; }
    return $b;
' LANGUAGE plperl;

如上所示,要让 PL/Perl 函数返回 SQL 空值,就返回一个未定义的值。无论函数是否为 strict,都可以这样做。

复合类型的参数以哈希的引用形式传给函数。哈希的键是该复合类型的属性名。下面是一个例子:

CREATE TABLE employee (
    name text,
    basesalary integer,
    bonus integer
);

CREATE FUNCTION empcomp(employee) RETURNS integer AS '
    my ($emp) = @_;
    return $emp->{''basesalary''} + $emp->{''bonus''};
' LANGUAGE plperl;

SELECT name, empcomp(employee) FROM employee;

目前不支持返回复合类型的结果值。

提示

由于函数体是作为 SQL 字符串字面量传给 CREATE FUNCTION 的,你必须转义 Perl 源码中的单引号和反斜线,通常像上例那样将它们加倍。另一种可行的方法是使用 Perl 的扩展引号操作符(q[]、qq[]、qw[])来避免写单引号。

报告文档问题

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