PostgreSQL7.0手册-用户手册-12. PL/perl - Perl 过程语言
内容
概述
制做和安装
使用 PL/Perl
本章描述如何编译,安装和使用 PL/Perl.
概述
PL/Perl 允许你用 Perl 脚本语言书写可以用于 SQL 查询的函数,就好象它们是内建在 Postgres 里一样.
PL/Perl 解释器是一个完整的 Perl 解释器.不过,有些操作出于安全性的考虑被屏蔽掉了.
通常,被限制的操作是那些于环境交互的动作.包括文件句柄操作,请求和使用(对于外部模块而言).
要知道,安全不是绝对的.实际上,有几种拒绝服务攻击仍然是可能的-存储器耗尽和无限循环就是两个例子.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
制作和安装
假设 Postgres 源代码树的根是 $PGSRC,那么 Pl/perl 源代码位于 $PGSRC/src/pl/plperl.
要制作,只需要按照下面步骤处理:
cd $PGSRC/src/pl/plperl
perl Makefile.PL
make
这样做将创建共享库文件.在一个 Linux 系统里,它将被叫做 plperl.so.在其他系统里的扩展名可能不同.
然后应该把该共享库拷贝到 postgres 安装的 lib 子目录下.
createlang 命令用于将该语言安装到一个数据库中.如果它被安装到 template1 里面,以后创建的所有数据库将自动安装这个语言.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
使用 PL/Perl
假设你有下面的表:
CREATE TABLE EMPLOYEE (
name text,
basesalary int4,
bonus int4 );
为了获取所有的薪水(本金+奖励),我们将定义下面这样的函数:
CREATE FUNCTION totalcomp(int4, int4) RETURNS int4
AS 'return $_[0] + $_[1]'
LANGUAGE 'plperl';
请注意参数会象想象的那样以 @_ 形式传递给函数.还有,因为 SQL 创建函数的引号规则,你会发现你要比平常更频繁地使用扩展的引号函数(qq[],q[],qw[]).
我们现在可以象下面这样使用我们的函数.
SELECT name, totalcomp(basesalary, bonus) from employee
不过,我们还可以把我们的整个记录传递个我们的函数:
CREATE FUNCTION empcomp(employee) returns int4
AS 'my $emp = shift;
return $emp->{'basesalary'} + $emp->{'bonus'};'
LANGUAGE 'plperl';
记录是作为一个散列(哈希 hash)数组的引用传递的.脚标是记录里面的字段名称.值是记录里面对应的字段的值.
新函数 empcomp 可以这样使用:
SELECT name, empcomp(employee) from employee;
--------------------------------------------------------------------------------