Perl Procedural Language
This chapter describes how to compile, install and
use PL/Perl.
Overview
PL/Perl allows you to write functions in the Perl scripting
language which may be used in SQL queries as if they were
built into Postgres.
The PL/Perl intepreter is a full Perl interpreter. However,
certain operations have been disabled in order to increase
the security level of the system.
In general, the operations that are restricted are those that
interact with the environment. This includes filehandle operations,
require, and use (for external
modules).
It should be noted that this security is not absolute. Indeed, several
Denial-of-Service attacks are still possible - memory exhaustion and
endless loops are two.
Building and Installing
Assuming that the Postgres
source tree is rooted at $PGSRC, then the Pl/perl source
code is located in $PGSRC/src/pl/plperl.
To build, simply do the following:
cd $PGSRC/src/pl/plperl
perl Makefile.PL
make
This will create a shared library file. On a Linux system, it will be
named plperl.so. The extension may differ on other systems.
The shared library should then be copied into the lib subdirectory of the
postgres installation.
The createlang command is used to install the language into a database.
If it is installed into template1, all future databases will have the
language installed automatically.
Using PL/Perl
Assume you have the following table:
CREATE TABLE EMPLOYEE (
name text,
basesalary int4,
bonus int4 );
In order to get the total compensation (base + bonus) we could
define a function as follows:
CREATE FUNCTION totalcomp(int4, int4) RETURNS int4
AS 'return $_[0] + $_[1]'
LANGUAGE 'plperl';
Note that the arguments are passed to the function in
@_ as might be expected. Also, because
of the quoting rules for the SQL creating the function, you
may find yourself using the extended quoting functions (qq[],
q[], qw[]) more often that you are used to.
We may now use our function like so:
SELECT name, totalcomp(basesalary, bonus) from employee
But, we can also pass entire tuples to our function:
CREATE FUNCTION empcomp(employee) returns int4
AS 'my $emp = shift;
return $emp->{'basesalary'} + $emp->{'bonus'};'
LANGUAGE 'plperl';
A tuple is passed as a reference to hash. The keys are the names of
fields in the tuples. The values are values of the corresponding
field in the tuple.
The new function empcomp can used like:
SELECT name, empcomp(employee) from employee;