PL/Perl は Perl プログラミング言語を使用して PostgreSQL 関数を作成することができる、読み込み可能な手続き言語です。
PL/Perl を特定のデータベースにインストールするには、createlang plperl dbname を使用します。
Tip: 言語を template1 にインストールすると、その後に作成されるデータベース全てに、その言語は自動的にインストールされます。
Note: ソースパッケージを使用するユーザは、インストールプロセスの間 PL/Perl のビルドを特に使用可能にしておく必要があります (詳細については、インストール手順を参照してください)。バイナリパッケージを使用する場合は、別個のサブパッケージに PL/Perl が入っている可能性があります。
PL/Perl 言語で関数を作成するには、以下の標準構文を使用して下さい。
CREATE FUNCTION funcname (argument-types) RETURNS return-type AS ' # PL/Perl function body ' LANGUAGE plperl;
関数本体は通常の Perl のコードです。
引数と結果は他の Perl サブルーチンと同様に扱われます。 引数は @_ の中に渡され、結果値は return、または、この関数で最後に評価された式として返されます。例えば、2つの整数の内大きな方を返す関数は以下のように定義できます。
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS ' if ($_[0] > $_[1]) { return $_[0]; } return $_[1]; ' LANGUAGE plperl;
SQL の NULL 値が関数に渡された場合、その引数値は Perl における "undefined" として現れます。 上の関数定義では、NULL が入力された場合うまく動作しないでしょう (実際はそれがゼロであるかのように動作するでしょう)。 STRICT を関数定義に加えることで、PostgreSQL の動作をより合理的にすることができます。 NULL 値が渡された場合、関数はまったく呼び出されず、単に NULL という結果が自動的に返されます。他の方法として、関数本体で未定義な入力をチェックすることもできます。 たとえば、perl_max の引数の片方が NULL、もう片方が非 NULL の場合に、NULL 値ではなく非 NULL の引数を返すようにするとします。
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 の NULL 値を返すためには、未定義値を返すようにして下さい。これは、関数が厳密かどうかに関係なく、実行することができます。
複合型の引数はハッシュへの参照として関数に渡されます。ハッシュのキーは複合型の属性名です。以下に例を示します。
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;
今のところ、複合型の結果値を返す機能はサポートされていません。
Tip: 関数本体は、CREATE FUNCTION にSQL 文字リテラルとして渡されますので、Perl ソース内の単一引用符やバックスラッシュをエスケープしなければなりません。 通常は上の例のようにそれらを二重にします。 他の方法は、Perl の拡張引用演算子 (q[]、qq[]、qw[]) を使用して、単一引用符を使用しないようにすることです。