Perl语言标量函数
下面的示例展示了一个简单的标量函数,用于对一组数字求和。 示例使用的文件名如下:"ApplyOp.pm
代码
- 使用Perlpackage 命令为示例类命名:
package ApplyOp; - 导入 "
nzae::Ae软件包,并将示例类定义为 "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 中,输入一个字符串运算符(用于加法的加号 (+) 或用于乘法的星号 (*))和两个整数。 代码会返回乘积或整数之和。 在 SQL 中,可以通过以下任一种方法调用简单的版本:
或SELECT applyopPl('+', 3, 5);SELECT applyopPl('*', 3, 5);上述例子中只有一个输入,而核动力源系统处理的是输入流。 因此,新农保系统更容易使用:SELECT applyopPl(mytable.operator, mytable.value1, mytable.value2) FROM mytable;在第一个例子中,NPS 系统将常数 "+"、3 和 5 转化为长度为 1 的数据流,其中包含三个元素。 其中一行被 "
getFunctionResult()"看到",里面有三个元素。 此外,按照Perl的惯例,调用对象作为第一个参数传递给函数。 函数通过使用变量 "$self来获取这一信息。 在内部,所有提到的情况都是以同样的方式处理的,可以假设 "applyopAE 有多个输入。 - 输入自定义代码来处理一行输入,因为需要循环处理输入,以便一次将一行输入交给函数:
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 用户报告错误,如果启用了日志记录,则会返回错误行的跟踪信息。您可以使用 "
cluck函数代替 "croak将警告写入日志文件。 要自动捕获任何未处理的异常,请使用 "autodie。 如果开启了日志记录功能,Die和 "warn也可用于报告单行错误或警告。Die会导致执行 AE 出错。 在注册时使用 "--level选项设置日志级别。_getFunctionResult()返回的是 SQL 操作的结果,由于是作为 UDF 运行,结果中只能有一列。总之,要编写只添加实际功能而不定制运行方法的 UDF,请按照以下步骤操作:- 创建一个Perl模块文件(在上述示例中为
ApplyOp.pm)。 - 导入并实例化文件中的 "
nzae::Ae类。 - 导入 "
autodie以处理执行过程中未处理的异常。 - 覆盖 "
_getFunctionResult以实现 UDF 的定制功能。 使用 "croak()方法处理返回给用户的错误。 - Execute the
run()method of thenzae::Aeobject. - 由于这是一个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