Perl语言标量函数

下面的示例展示了一个简单的标量函数,用于对一组数字求和。 示例使用的文件名如下:"ApplyOp.pm

代码

  1. 使用Perlpackage 命令为示例类命名:
    package ApplyOp;
  2. 导入 "nzae::Ae软件包,并将示例类定义为 "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 中,输入一个字符串运算符(用于加法的加号 (+) 或用于乘法的星号 (*))和两个整数。 代码会返回乘积或整数之和。 在 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 有多个输入。

  5. 输入自定义代码来处理一行输入,因为需要循环处理输入,以便一次将一行输入交给函数:
    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,请按照以下步骤操作:
    1. 创建一个Perl模块文件(在上述示例中为ApplyOp.pm)。
    2. 导入并实例化文件中的 "nzae::Ae类。
    3. 导入 "autodie以处理执行过程中未处理的异常。
    4. 覆盖 "_getFunctionResult以实现 UDF 的定制功能。 使用 "croak()方法处理返回给用户的错误。
    5. Execute the run() method of the nzae::Ae object.
    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

正在运行

现在可以在系统数据库的 SQL 中运行 AE:
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