Perl言語スカラー関数
次の例は、数値の集合を合計する単純なスカラー関数を示している。 この例では、次のファイル名を使用している: 'ApplyOp.pm
コード
- Perlのpackageコマンドを使ってサンプル・クラスに名前を付けます:
package ApplyOp; nzae::Aeパッケージをインポートし、exampleクラスを'nzae::Aeクラスの子クラスとして定義する。use nzae::Ae; our @ISA = qw(nzae::Ae);- クラスを定義してください。 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; - カスタム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には複数の入力があると仮定できる。 - 入力を処理するループは、一度に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を書くには、以下の手順に従えばよい:- Perlモジュールファイル(前述の例では
ApplyOp.pm)を作成する。 - ファイルにある'
nzae::Aeクラスをインポートしてインスタンス化する。 autodieをインポートして、実行中に処理されなかった例外を処理する。_getFunctionResultをオーバーライドして、UDF 用にカスタマイズされた機能を実装する。croak()メソッドを使用してユーザーに返すエラーを処理する。nzae::Aeオブジェクトの 'run()メソッドを実行する。- これはPerlモジュールなので、ファイル'
ApplyOp.pmの最後に "1 "を追加する。
コードが完成したら、デプロイして登録しなければならない。
- Perlモジュールファイル(前述の例では
コンパイル
PerlAEはコンパイルを必要としない。
デプロイメント
--templateデプロイメントオプションと一緒に引き続き使用されます。$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ApplyOp.pm登録
$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実行中
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