↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 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[])来避免写单引号。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。