Sie können benutzerspezifische Datenbankfunktionen definieren. In einer SQL-Anweisung kann diese benutzerdefinierte Datenbankfunktion dann wie jede andere festdefinierte Funktion verwendet werden.
Eine Datenbankfunktion kann mehrere SQL-Anweisungen enthalten und dem Anwendungsentwickler stehen eine Reihe von Kontrollstrukturen zur Verfügung. Sie können z.B. Schleifen oder Verzweigungen innerhalb einer Datenbankfunktion programmieren.
Datenbankfunktionen sind spezialisierte Datenbankprozeduren, die beliebig viele Eingabe-, aber nur genau einen Ausgabeparameter besitzen. Der Ausgabeparameter stellt das Ergebnis der Datenbankfunktion dar.
Sie benötigen die Demo-Daten für das SQL-Tutorial.
Starten Sie das Query Tool SQL Studio als Datenbankadministrator MONA mit dem Kennwort RED und melden Sie sich an die Demo-Datenbankinstanz DEMODB an.
Zum Anlegen einer Datenbankfunktion verwenden Sie die CREATE FUNCTION-Anweisung.
CREATE FUNCTION
hotel.avgprice (zip CHAR(5)) RETURNS FIXED(6,2) AS
VAR sum FIXED(10,2); price FIXED(6,2);
hotels INTEGER; avg_price FIXED(6,2);
TRY
SET sum = 0; SET hotels = 0;
DECLARE functionresult CURSOR FOR
SELECT price FROM hotel.room,hotel.hotel WHERE zip = :zip AND
room.hno = hotel.hno AND type = 'single';
WHILE $rc = 0 DO BEGIN
FETCH functionresult INTO :price;
SET sum = sum + price;
SET hotels = hotels + 1;
END;
CATCH
IF $rc <> 100 THEN STOP ($rc, 'unexpected error');
CLOSE functionresult;
IF hotels > 0 THEN RETURN sum/hotels
ELSE RETURN NULL;
Die Datenbankfunktion avgprice bestimmt den durchschnittlichen Preis für Einzelzimmer in Hotels, die im angegebenen Postleitzahlenbereich liegen.
● Eingabeparameter ist die Postleitzahl zip, Nach dem Schlüsselwort RETURNS wird der Datentyp des Ausgabewerts festgelegt.
● Nach dem Schlüsselwort AS werden die SQL-Anweisungen (z.B. SELECT-Anweisung) und Kontrollstrukturen (z.B. WHILE- und eine IF-Anweisung) definiert, die zum Ausführen der gewünschten Funktion erforderlich sind.
● Nach dem Schlüsselwort VAR werden die innerhalb der Datenbankfunktion erforderlichen Variablen definiert.
● Fehlerbehandlung: Wenn in der Anweisungsfolge zwischen TRY und CATCH ein SQL-Fehler auftritt, wird unverzüglich in die auf das CATCH folgende Anweisung verzweigt. In dieser Anweisung kann die eigentliche Fehlerbehandlung programmiert werden.
● Mittels SET werden den Variablen sum und hotels Werte zugewiesen.
● Durch die DECLARE CURSOR-Anweisung wird die benannte Ergebnistabelle functionresult definiert.
● In der SELECT-Anweisung müssen die Tabellen vollständig, d.h. unter Angabe des Eigentümers angegeben werden. Beachten Sie, dass die Übergabe der Postleitzahl als Parameter erfolgt: :zip.
● Die WHILE-Anweisung ermöglicht die bedingte Wiederholung von Anweisungen. Solange die angegebene Suchbedingung zutrifft, wird die Anweisung ausgeführt.
● Die FETCH-Anweisung weist Parametern die Werte der aktuellen Zeile der Ergebnistabelle functionresult zu.
● Die $rc-Variable liefert nach der Ausführung der SELECT-Anweisung einen numerischen Fehlercode zurück. Der Wert 0 bedeutet, dass die SELECT-Anweisung erfolgreich ausgeführt wurde.
● Eine IF-Anweisung wertet zunächst die Suchbedingung aus. Ist diese erfüllt, so wird die im THEN-Zweig definierte Anweisung ausgeführt, andernfalls wird - wenn vorhanden - die Anweisung im ELSE-Zweig ausgeführt.
● Die CLOSE-Anweisung löscht die Ergebnistabelle functionresult.
● Nach dem Schlüsselwort RETURN wird der Ausgabeparameter definiert.
Siehe auch:
SQL-Referenzhandbuch, CREATE FUNCTION-Anweisung
(create_function_statement)
SQL-Referenzhandbuch, Routine (routine)
Systemtabellen
auswerten, FUNCTIONS
Zum Aufrufen einer Datenbankfunktion verfahren Sie wie beim Aufruf einer fest definierten Funktion.
Wenn die Tabelle hotel mit den SQL-Anweisungen für das Schema HOTEL erzeugt und mit Daten gefüllt wurde, können Sie folgende SELECT-Anweisung ausprobieren:
SELECT hno, hotel.avgprice(zip) avgprice FROM hotel.hotel WHERE hno < 100
Ergebnis
HNO |
AVGPRICE |
10 |
135 |
20 |
70 |
30 |
45 |
40 |
87.5 |
50 |
105 |
60 |
120 |
70 |
115 |
80 |
87.5 |
90 |
90 |
Siehe auch:
SQL-Referenzhandbuch, Datenbankfunktionsaufruf
(dbfunction_call)
Zum Löschen einer Datenbankfunktion verwenden Sie DROP FUNCTION-Anweisung.
DROP FUNCTION hotel.avgprice
Mit Hilfe dieser SQL-Anweisung löschen Sie die Definition der Datenbankfunktion.
Siehe auch:
SQL-Referenzhandbuch, DROP
FUNCTION-Anweisung (drop_function_statement)
Weitere Beispiele zur Datendefinition