pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
目录
PL/Perl 是一种可装载的过程语言,使你能够用 Perl 编程语言编写 PostgreSQL 函数。
要在某个特定数据库中安装 PL/Perl,使用 createlang plperl 。dbname
如果把某种语言安装到template1中,之后创建的所有数据库都会自动安装该语言。
源码包的用户必须在安装过程中专门启用 PL/Perl 的构建。(更多信息 请参阅安装说明。)二进制包的 用户可能会在单独的子包中找到 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[])来避免写单引号。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。