Skalare Funktion der Sprache Perl
Das folgende Beispiel zeigt eine einfache skalare Funktion, die eine Reihe von Zahlen summiert. Das Beispiel verwendet den folgenden Dateinamen: ' ApplyOp.pm
Code erstellen
- Benennen Sie die Beispielklasse mit Hilfe des Perl:
package ApplyOp;
- Importieren Sie das Paket "
nzae::Ae
und definieren Sie die Beispielklasse als Unterklasse der Klasse "nzae::Ae
.use nzae::Ae; our @ISA = qw(nzae::Ae);
- Definieren Sie die Klasse. Wie bei den Python übernimmt die Basisklasse den größten Teil der Arbeit. Normalerweise wird die Methode "
new()
aufgerufen, um die Klasse zu initialisieren, und anschließend wird die Methode "run()
aufgerufen. Die Methode "run()
ruft die entsprechende abgeleitete Funktion auf. Bei UDF-basierten AEs wie dieser muss die Funktion "_getFunctionResult()
überschrieben werden, da sie standardmäßig für jede Eingabezeile einmal aufgerufen wird: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;
- Fügen Sie den benutzerdefinierten Perl hinzu. In dieser UDF wird ein String-Operator übergeben, der entweder ein Pluszeichen (+) zum Addieren oder ein Sternchen (*) zum Multiplizieren ist, sowie zwei Ganzzahlen. Der Code gibt entweder das Produkt oder die Summe der ganzen Zahlen zurück. In SQL kann eine einfache Version davon entweder aufgerufen werden durch:
oderSELECT applyopPl('+', 3, 5);
SELECT applyopPl('*', 3, 5);
Während das genannte Beispiel nur einen Eingang hat, arbeitet das NPS-System mit Eingangsströmen. Daher wird das NPS-System mit größerer Wahrscheinlichkeit genutzt:SELECT applyopPl(mytable.operator, mytable.value1, mytable.value2) FROM mytable;
Im ersten Beispiel nimmt das NPS-System die Konstanten "+", 3 und 5 und wandelt sie in einen Stream der Länge 1 um, der drei Elemente enthält. Eine Zeile wird von '
getFunctionResult()
mit den drei Elementen darin "gesehen". Außerdem wird, wie in Perl üblich, das aufrufende Objekt als erstes Argument an die Funktion übergeben. Dies wird von der Funktion über die Variable "$self
aufgenommen. Intern werden alle genannten Fälle auf die gleiche Weise behandelt, und es kann davon ausgegangen werden, dass es mehrere Eingänge für die AE "applyop
gibt. - Geben Sie benutzerdefinierten Code ein, um eine Zeile der Eingabe zu verarbeiten, da eine Schleifenverarbeitung der Eingabe erforderlich ist, um jeweils eine Zeile an die Funktion weiterzugeben:
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;
Die Funktion '
croak
meldet den Fehler an den SQL-Benutzer und gibt, wenn die Protokollierung aktiviert ist, einen Trace zur Fehlerzeile zurück.Sie können die Funktion '
cluck
anstelle von 'croak
verwenden, um Warnungen in die Protokolldatei zu schreiben. Um unbehandelte Ausnahmen automatisch abzufangen, verwenden Sie "autodie
.Die
und 'warn
können auch verwendet werden, um einen einzeiligen Fehler oder eine Warnung zu melden, wenn die Protokollierung eingeschaltet ist.Die
führt dazu, dass die Ausführung der AE fehlschlägt. Legen Sie die Protokollierungsstufe fest, indem Sie bei der Registrierung die Option "--level
verwenden. Die Rückgabe von "_getFunctionResult()
ist das Ergebnis der SQL-Operation, und da diese als UDF ausgeführt wird, kann das Ergebnis nur eine Spalte enthalten.Um eine UDF zu schreiben, die nur die eigentliche Funktionalität hinzufügt, ohne die Methoden zur Ausführung anzupassen, gehen Sie wie folgt vor:- Erstellen Sie eine Perl (
ApplyOp.pm
im genannten Beispiel). - Importieren und instanziieren Sie die Klasse "
nzae::Ae
in der Datei. - Importieren Sie '
autodie
, um unbehandelte Ausnahmen während der Ausführung zu behandeln. - Überschreiben Sie '
_getFunctionResult
, um angepasste Funktionen für UDF zu implementieren. Behandlung von Fehlern, die mit der Methode "croak()
" an den Benutzer zurückgegeben werden. - Führen Sie die Methode '
run()
des Objekts 'nzae::Ae
aus. - Da es sich um ein Perl handelt, fügen Sie eine "1" am Ende der Datei '
ApplyOp.pm
hinzu.
Wenn der Code vollständig ist, muss er bereitgestellt und registriert werden.
- Erstellen Sie eine Perl (
Kompilierung
Perl müssen nicht kompiliert werden.
Bereitstellung
--template
verwendet, um das Skript am Standardspeicherort auf dem gemeinsamen Exportlaufwerk zu verteilen.$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language perl --version 3 \
--template deploy ApplyOp.pm
Registrierung
$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
Aktiv
SELECT applyopPl('+', 4, 10);
APPLYOPPL
-----------
14
(1 row)
_getFunctionResult()
die Methode " croak()
aufgerufen wird. Das folgende Beispiel löst einen Fehler aus:SELECT applyopPl('-', 1, 2);
ERROR: Unhandled operator to ApplyOp: '-'. at
/nz/export/ae/applications/system/admin/ApplyOp.pm line 28