Perl言語スカラー関数

次の例は、数値の集合を合計する単純なスカラー関数を示している。 この例では、次のファイル名を使用している: 'ApplyOp.pm

コード

  1. Perlのpackageコマンドを使ってサンプル・クラスに名前を付けます:
    package ApplyOp;
  2. nzae::Aeパッケージをインポートし、exampleクラスを'nzae::Aeクラスの子クラスとして定義する。
    use nzae::Ae;
    our @ISA = qw(nzae::Ae);
  3. クラスを定義してください。 Pythonの例と同様に、基本クラスがほとんどの作業を処理する。 通常、クラスを初期化するために'new()メソッドが呼ばれ、次に'run()メソッドが呼ばれる。 run()メソッドは適切な派生関数を呼び出す。 このようなUDFベースのAEでは、'_getFunctionResult()関数をオーバーライドする必要がある:
    package ApplyOp;
    use strict;
    use autodie;
    use nzae::Ae;
    our @ISA = qw(nzae::Ae);
    my $ae = ApplyOp->new();
    $ae->run();
    sub _getFunctionResult(@)
    {
    #User defined function code goes here
    }
    1;
  4. カスタムPerlコードを追加する。 このUDFでは、文字列演算子(足し算の場合はプラス記号(+)、掛け算の場合はアスタリスク(*))と、2つの整数が渡される。 このコードは整数の積か和を返す。 SQLでは、この単純なバージョンはどちらかによって呼び出される:
    SELECT applyopPl('+', 3, 5);
    または
    SELECT applyopPl('*', 3, 5);
    前述の例では入力は1つだけだが、NPSシステムは入力のストリームを扱う。 従って、NPSシステムの方が利用しやすい:
    SELECT applyopPl(mytable.operator, mytable.value1, mytable.value2) FROM mytable;

    最初の例では、NPSシステムは定数 "+"、3、5を受け取り、それらを3つの要素を含む長さ1のストリームに変える。 getFunctionResult()、3つの要素を持つ1つの行が「見える」。 さらに、Perlの慣例として、呼び出し側のオブジェクトは関数の第1引数として渡される。 これは、変数'$selfを使って関数によってピックアップされる。 内部的には、前述のケースはすべて同じように処理され、「applyopAEには複数の入力があると仮定できる。

  5. 入力を処理するループは、一度に1行を関数に渡すために必要なので、1行の入力を処理するカスタムコードを入力する:
    package ApplyOp;
    use nzae::Ae;
    use strict;
    use autodie;
    our @ISA = qw(nzae::Ae);
    my $ae = ApplyOp->new();
    $ae->run();
    sub _getFunctionResult(@)
    {
    my $self = shift;
    # BREAK APART OUR ROW OF INPUT.
    my ($operator, $leftInput, $rightInput) = @_;
    # HANDLE ADDITION.
    if ($operator eq "+")
    {
    return $leftInput + $rightInput;
    }
    # HANDLE MULTIPLICATION.
    if ($operator eq "*")
    {
    return $leftInput * $rightInput;
    }
    # ERROR ON ALL OTHER.
    croak(nzae::Exceptions::AeInternalError->new("Unhandled operator to ApplyOp: '" .
    $operator . "'."));
    }
    1;

    croak関数は SQL ユーザーにエラーを報告し、ロギングが有効な場合はエラー行のトレースを返します。

    ログファイルへの警告の書き込みには、'croak代わりに'cluck関数を使うことができる。 処理されなかった例外を自動的にキャッチするには、'autodie を使用する。 Dieと'warnは、ロギングがオンの場合、1行のエラーや警告を報告するのにも使える。 DieAEの実行をエラーにする。 登録時に「--levelオプションを使用してログレベルを設定します。 _getFunctionResult()で返されるのはSQL操作の結果であり、これはUDFとして実行されるため、結果には1つの列しか存在しない。

    要約すると、UDFを実行するためのメソッドをカスタマイズせずに、実際の機能だけを追加するUDFを書くには、以下の手順に従えばよい:
    1. Perlモジュールファイル(前述の例ではApplyOp.pm)を作成する。
    2. ファイルにある'nzae::Aeクラスをインポートしてインスタンス化する。
    3. autodieをインポートして、実行中に処理されなかった例外を処理する。
    4. _getFunctionResultをオーバーライドして、UDF 用にカスタマイズされた機能を実装する。 croak()メソッドを使用してユーザーに返すエラーを処理する。
    5. nzae::Aeオブジェクトの 'run()メソッドを実行する。
    6. これはPerlモジュールなので、ファイル'ApplyOp.pmの最後に "1 "を追加する。

    コードが完成したら、デプロイして登録しなければならない。

コンパイル

PerlAEはコンパイルを必要としない。

デプロイメント

PerlAEはコンパイルを必要としないが、デプロイする必要がある。 compile_aeコマンドは、スクリプトを共有エクスポートドライブ上のデフォルトの場所にデプロイする「--templateデプロイメントオプションと一緒に引き続き使用されます。
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ApplyOp.pm

登録

Perlファイルを登録する:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language perl --version 3 \
--template udf --exe ApplyOp.pm --sig "applyopPl(varchar(1), int4, int4)"\
--return int4

実行中

これでAEをシステム・データベース上のSQLで実行できるようになった:
SELECT applyopPl('+', 4, 10);
APPLYOPPL
-----------
14
(1 row)
_getFunctionResult()の型を検証するために、'croak()メソッドが呼ばれることに注意。 次の例ではエラーが発生する:
SELECT applyopPl('-', 1, 2);
ERROR: Unhandled operator to ApplyOp: '-'. at
/nz/export/ae/applications/system/admin/ApplyOp.pm line 28