Fonction scalaire en langage Perl
L'exemple suivant montre une fonction scalaire simple qui additionne un ensemble de nombres. L'exemple utilise le nom de fichier suivant : " ApplyOp.pm
Coder
- Nommez la classe d'exemple à l'aide de la commande Perl package :
package ApplyOp; - Importez le paquetage "
nzae::Aeet définissez la classe exemple comme une classe enfant de la classe "nzae::Ae.use nzae::Ae; our @ISA = qw(nzae::Ae); - Définir la classe. Comme dans les exemples Python, la classe de base se charge de la majeure partie du travail. En règle générale, la méthode "
new()est appelée pour initialiser la classe, puis la méthode "run()est appelée. La méthode "run()appelle la fonction dérivée appropriée. Pour les AE basés sur l'UDF comme celui-ci, la fonction "_getFunctionResult()doit être remplacée, car elle est appelée par défaut une fois pour chaque ligne d'entrée :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; - Ajouter le code Perl personnalisé. Dans cet UDF, un opérateur de chaîne est transmis, qui est soit un signe plus (+) pour ajouter, soit un astérisque (*) pour multiplier, et deux nombres entiers. Le code renvoie soit le produit, soit la somme des nombres entiers. En SQL, une version simple de cette fonction peut être appelée par l'une ou l'autre des méthodes suivantes :
ouSELECT applyopPl('+', 3, 5);SELECT applyopPl('*', 3, 5);Alors que l'exemple mentionné ne comporte qu'une seule entrée, le système NPS traite des flux d'entrées. Par conséquent, le système NPS est plus susceptible d'être utilisé :SELECT applyopPl(mytable.operator, mytable.value1, mytable.value2) FROM mytable;Dans le premier exemple, le système NPS prend les constantes "+", 3 et 5 et les transforme en un flux de longueur 1 contenant trois éléments. Une ligne est "vue" par "
getFunctionResult()avec les trois éléments qu'elle contient. En outre, comme dans la convention Perl, l'objet appelant est transmis en tant que premier argument de la fonction. La fonction reprend cette information en utilisant la variable "$self. En interne, tous les cas mentionnés sont traités de la même manière et l'on peut supposer qu'il y a plusieurs entrées dans l'AE "applyop - Saisir un code personnalisé pour gérer une ligne d'entrée, car la gestion de la boucle d'entrée est nécessaire pour transmettre une ligne à la fonction à la fois :
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 fonction "
croaksignale l'erreur à l'utilisateur SQL et, si la journalisation est activée, renvoie une trace jusqu'à la ligne d'erreur.Vous pouvez utiliser la fonction "
cluckà la place de "croakpour écrire des avertissements dans le fichier journal. Pour rattraper automatiquement toute exception non gérée, utilisez "autodie.Dieet 'warnpeuvent également être utilisés pour signaler une erreur ou un avertissement sur une seule ligne, si la journalisation est activée.Dieinterrompt l'exécution de l'AE. Définissez le niveau d'enregistrement en utilisant l'option '--levellors de l'enregistrement. Ce qui est renvoyé par "_getFunctionResult()est le résultat de l'opération SQL, et comme il s'agit d'un UDF, le résultat ne peut comporter qu'une seule colonne.En résumé, pour écrire un UDF en ajoutant uniquement la fonctionnalité réelle sans personnaliser les méthodes d'exécution, suivez les étapes suivantes :- Créez un fichier module Perl (
ApplyOp.pmdans l'exemple cité). - Importez et instanciez la classe "
nzae::Aedans le fichier. - Importer "
autodiepour gérer les exceptions non gérées pendant l'exécution. - Remplacer "
_getFunctionResultpour mettre en œuvre une fonctionnalité personnalisée pour l'UDF. Traiter les erreurs à renvoyer à l'utilisateur en utilisant la méthode "croak() - Exécute la méthode "
run()de l'objet "nzae::Ae. - Comme il s'agit d'un module Perl, ajoutez un "1" à la fin du fichier "
ApplyOp.pm.
Lorsque le code est complet, il doit être déployé et enregistré.
- Créez un fichier module Perl (
Compilation
Les AE Perl ne nécessitent pas de compilation.
Déploiement
--template pour déployer le script à l'emplacement par défaut sur le lecteur d'exportation partagé.$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ApplyOp.pmEnregistrement
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language perl --version 3 \
--template udf --exe ApplyOp.pm --sig "applyopPl(varchar(1), int4, int4)"\
--return int4En cours d'exécution
SELECT applyopPl('+', 4, 10);
APPLYOPPL
-----------
14
(1 row)
_getFunctionResult(), la méthode " croak() est appelée. L'exemple suivant déclenche une erreur :SELECT applyopPl('-', 1, 2);
ERROR: Unhandled operator to ApplyOp: '-'. at
/nz/export/ae/applications/system/admin/ApplyOp.pm line 28