Oracle: Funktionen
Neben den vielen Funktionen, die die SQL-Sprache schon bietet, kann man eigene Funktionen definieren. Funktionen haben immer einen oder mehrere Input-Parameter und genau einen Ergebniswert.
Hier ein ganz einfaches Beispiel einer Funktion, die einen String als Input erwartet und einen String als Ergebnis liefert. Die Verarbeitung der Funktion besteht darin, den Input-Parameter um ein 'x' zu erweitern.
CREATE OR REPLACE FUNCTION myfunction (in_parm VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN in_parm || 'x'; END; /
Diese Funktion kann man nun genauso verwenden wie die anderen bereits vordefinierten Funktionen. Man muss nur darauf achten, dass man die richtige Anzahl an Parametern angibt und die passenden Datentypen wählt. Beispielaufruf:
SELECT loc, myfunction(loc) FROM scott.dept;
Ergebnis:
LOC MYFUNCTION(LOC) ------------- --------------- NEW YORK NEW YORKx DALLAS DALLASx CHICAGO CHICAGOx BOSTON BOSTONx
Im Anweisungsteil der Funktion können beliebig komplexe PL/SQL-Anweisungen angegeben werden. Ein Beispiel für eine etwas komplexere Funktion:
CREATE OR REPLACE FUNCTION anzma (abteilung VARCHAR2) RETURN INTEGER IS h_anzahl INTEGER; BEGIN SELECT COUNT(*) INTO h_anzahl FROM ben01.templ WHERE workdept = abteilung; RETURN h_anzahl; END; /
Funktionen kann man gut testen, indem man sie in einem SELECT einsetzt, der aus der Tabelle dual liest. Diese Tabelle enthält genau einen Satz mit einer Spalte. Eigentlich ist man aber an diesem Satz gar nicht interessiert, sondern man will durch diesen SELECT nur bewirken, dass die Funktion genau einmal aufgerufen wird. Aufrufbeispiel:
SELECT anzma('A00') FROM dual;
Ergebnis:
ANZMA('A00') ------------ 3
Hinweise:
- Die 1. Funktion ist deterministisch, d.h. wenn man die Funktion zweimal mit demselben Eingabe-Parameter aufruft, dann liefert sie immer denselben Output.
- Die 2. Funktion ist nicht-deterministisch, d.h. ihr Ergebnis ist auch von anderen Informationen abhängig als nur den übergebenen Parametern. Wenn jemand die Sätze in der Tabelle ben01.templ ändert, dann kann die Funktion anzma bei gleichem Eingabe-Parameter ein anderes Ergebnis liefern.