26.2. 使用 PL/Perl

假设你有下面的表:

CREATE TABLE EMPLOYEE (
    name text,
    basesalary integer,
    bonus integer
);
为了获取所有的薪水(本金+奖励)(base+bonus),我们将定义下面这样的函数:
CREATE FUNCTION totalcomp(integer, integer) RETURNS integer
    AS 'return $_[0] + $_[1]'
    LANGUAGE 'plperl';
请注意参数会象想象的那样以 @_ 形式传递给函数.

我们现在可以象下面这样使用我们的函数:

SELECT name, totalcomp(basesalary, bonus) FROM employee;

不过,我们还可以把我们的整个记录传递个我们的函数:

CREATE FUNCTION empcomp(employee) RETURNS integer AS '
    my $emp = shift;
    return $emp->{''basesalary''} + $emp->{''bonus''};
' LANGUAGE 'plperl';
记录是作为一个散列(哈希 hash)数组的引用传递的. 脚标是记录里面的字段名称.值是记录里面对应的字段的值.

小技巧: 因为函数体是以一个 SQL 字串文本的方式传递给 CREATE FUNCTION,因此你必须在你的 Perl 源程序里 逃逸单引号,要么用上面显示的写两份的方法,要么使用扩展引起函数 (q[]qq[]qw[]).你必须用写双份的方法逃逸反斜扛.

新函数 empcomp 可以这样使用:

SELECT name, empcomp(employee) FROM employee;

这里是一个不能用的函数的例子,因为由于安全原因, 文件系统操作是不允许的:

CREATE FUNCTION badfunc() RETURNS integer AS '
    open(TEMP, ">/tmp/badfile");
    print TEMP "Gotcha!\n";
    return 1;
' LANGUAGE 'plperl';
这个函数可以成功创建,但是不能执行.