第 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 FUNCTIONfuncname(argument-types) RETURNSreturn-typeAS ' # 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[])来避免写单引号。