26.2. PL/Perlを使用する

以下のテーブルが在るものと仮定します:

CREATE TABLE EMPLOYEE (
    name text,
    basesalary integer,
    bonus integer
);
給与合計 (基本給+ボーナス) を取得する為に、以下のような関数を 定義することができます:
CREATE FUNCTION totalcomp(integer, integer) RETURNS integer
    AS 'return $_[0] + $_[1]'
    LANGUAGE 'plperl';
これらの引数は関数に対して 期待されるように、 @_ で渡されることに注目してください。

作成した関数は、次のように使えます。

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

またここで、PL/Perl 関数にタプル全体を渡すこともできます:

CREATE FUNCTION empcomp(employee) RETURNS integer AS '
    my $emp = shift;
    return $emp->{''basesalary''} + $emp->{''bonus''};
' LANGUAGE 'plperl';
ひとつのタプルは、ハッシュへのリファレンスとして渡されます。 キーはタプルのフィールド名です。値は、タプルの中の対応する フィールドの値になります。

Tip: 関数本体が CREATE FUNCTIONへのSQL文字列リテラル として渡されるので、Perlソース内のシングル・クォートは、 上記のように2重に書くか、あるいは、クォート用の関数 (q[], qq[], qw[])を使う必要があります。 バックスラッシュは2重してエスケープしなければなりません。

新規の関数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';
関数を作ることはできますが、実行することはできません。