他のバージョンの文書11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

Chapter 21. PL/Perl - Perl 手続き言語

Table of Contents
21.1. PL/Perl 関数と引数
21.2. PL/Perl におけるデータ値
21.3. PL/Perlからのデータベースアクセス
21.4. 信頼された PL/Per および信頼されない PL/Perl
21.5. 存在しない機能

PL/Perl は Perl プログラミング言語を使用して PostgreSQL 関数を作成することができる、読み込み可能な手続き言語です。

PL/Perl を特定のデータベースにインストールするには、createlang plperl dbname を使用します。

Tip: 言語を template1 にインストールすると、その後に作成されるデータベース全てに、その言語は自動的にインストールされます。

Note: ソースパッケージを使用するユーザは、インストールプロセスの間 PL/Perl のビルドを特に使用可能にしておく必要があります (詳細については、インストール手順を参照してください)。バイナリパッケージを使用する場合は、別個のサブパッケージに PL/Perl が入っている可能性があります。

21.1. 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[]) を使用して、単一引用符を使用しないようにすることです。