第 39 章 PL/Perl - Perl 过程语言
PL/Perl 是一种可装载的过程语言,使你能够用 Perl 编程语言编写 PostgreSQL 函数。
要在某个特定数据库中安装 PL/Perl,使用
createlang plperl 。
dbname
提示
如果把某种语言安装到template1中,之后创建的所有数据库都会自动安装该语言。
注意
源码包的用户必须在安装过程中专门启用 PL/Perl 的构建。(更多信息请参阅安装说明。)二进制包的用户可能会在单独的子包中找到 PL/Perl。
39.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 中将显示为“未定义”。上面的函数定义对空输入表现不太好(事实上,它会把它们当作零来处理)。我们可以在函数定义中加上 STRICT,让
PostgreSQL 做更合理的事情:如果传入空值,函数根本不会被调用,而是自动返回空结果。另一种做法是在函数体内检查未定义的输入。例如,假设我们希望
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[])来避免写单引号。