Función escalar en lenguaje Perl

El siguiente ejemplo muestra una función escalar simple que suma un conjunto de números. El ejemplo utiliza el siguiente nombre de archivo: ' ApplyOp.pm

Código

  1. Nombra la clase de ejemplo utilizando el comando package Perl:
    package ApplyOp;
  2. Importa el paquete ' nzae::Ae y define la clase ejemplo como clase hija de la clase ' nzae::Ae.
    use nzae::Ae;
    our @ISA = qw(nzae::Ae);
  3. Definir la clase. Como en los ejemplos Python, la clase base se encarga de la mayor parte del trabajo. Normalmente se llama al método ' new() ' para inicializar la clase, y luego se llama al método ' run(). El método ' run() ' llama a la función derivada correspondiente. Para los EAs basados en UDF como éste, la función ' _getFunctionResult() ' debe ser sobrescrita, ya que por defecto se llama una vez por cada fila de entrada:
    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. Añada el código Perl personalizado. En esta UDF, se pasa un operador de cadena, que puede ser un signo más (+) para sumar o un asterisco (*) para multiplicar, y dos enteros. El código devuelve el producto o la suma de los enteros. En SQL, una versión simple de esto puede ser llamado por cualquiera de los dos:
    SELECT applyopPl('+', 3, 5);
    o
    SELECT applyopPl('*', 3, 5);
    Mientras que el ejemplo mencionado sólo tiene una entrada, el sistema NPS trata con flujos de entrada. Por lo tanto, es más probable que se utilice el sistema NPS:
    SELECT applyopPl(mytable.operator, mytable.value1, mytable.value2) FROM mytable;

    En el primer ejemplo, el sistema NPS toma las constantes "+", 3 y 5 y las convierte en un flujo de longitud 1 que contiene tres elementos. Una fila es "vista" por ' getFunctionResult() ' con los tres elementos en ella. Además, como es convención en Perl, el objeto invocador se pasa como primer argumento de la función. La función lo recoge mediante la variable " $self. Internamente, todos los casos mencionados se manejan de la misma manera y se puede asumir que hay múltiples entradas al AE ' applyop.

  5. Introducir código personalizado para manejar una fila de entrada, ya que se necesita la entrada de manejo de bucle para entregar una fila a la función a la vez:
    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;

    La función ' croak ' informa del error al usuario de SQL y, si el registro está activado, devuelve una traza de la línea de error.

    Puede utilizar la función ' cluck ' en lugar de ' croak ' para escribir advertencias en el archivo de registro. Para capturar automáticamente las excepciones no controladas, utilice ' autodie. también se pueden utilizar Die ' y ' warn ' para informar de un error o advertencia de una sola línea, si el registro está activado. Die falla la ejecución del AE. Establezca el nivel de registro utilizando la opción " --level " durante el registro. Lo que devuelve ' _getFunctionResult() ' es el resultado de la operación SQL, y como se ejecuta como una UDF, sólo puede haber una columna en el resultado.

    En resumen, para escribir una UDF añadiendo sólo la funcionalidad real sin personalizar los métodos para ejecutarla, siga los siguientes pasos:
    1. Cree un archivo de módulo Perl (ApplyOp.pm en el ejemplo mencionado).
    2. Importa e instanciar la clase ' nzae::Ae ' en el archivo.
    3. Importar ' autodie ' para manejar excepciones no manejadas durante la ejecución.
    4. Sustituya ' _getFunctionResult ' para implementar una funcionalidad personalizada para UDF. Manejar los errores que se devolverán al usuario utilizando el método ' croak() '.
    5. Ejecuta el método ' run() ' del objeto ' nzae::Ae '.
    6. Dado que se trata de un módulo Perl, añada un "1" al final del archivo ' ApplyOp.pm.

    Cuando el código está completo, debe desplegarse y registrarse.

Una compilación

Los EAs de Perl no requieren compilación.

virtual

Aunque los EAs Perl no requieren compilación, deben ser desplegados. El comando " compile_ae " se sigue utilizando con la opción de despliegue " --template " para desplegar el script en la ubicación predeterminada de la unidad de exportación compartida.
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ApplyOp.pm

Registro

Registre el archivo 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

En ejecución

Ahora se puede ejecutar el AE en SQL en la base de datos del sistema:
SELECT applyopPl('+', 4, 10);
APPLYOPPL
-----------
14
(1 row)
Observe que para validar los tipos en ' _getFunctionResult(), se llama al método ' croak(). El siguiente ejemplo provoca un error:
SELECT applyopPl('-', 1, 2);
ERROR: Unhandled operator to ApplyOp: '-'. at
/nz/export/ae/applications/system/admin/ApplyOp.pm line 28