## Datenbankfunktionen

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.

### Voraussetzungen

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.

### Anlegen einer Datenbankfunktion

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.

##### Erläuterung

● 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

### Aufrufen einer Datenbankfunktion

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)

### Löschen einer Datenbankfunktion

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