## Datenbankprozeduren

Datenbankprozeduren sind Programme, die aus einem Anwendungsprogramm heraus wie eine SQL-Anweisung aufgerufen werden können. Eine Datenbankprozedur 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 Datenbankprozedur programmieren.

Sie können sowohl Eingabe- als auch Ausgabeparameter definieren, um einer Datenbankprozedur eigene Werte zu übermitteln bzw. Ergebnisse zu erhalten.

Mögliche Anwendungsgebiete sind z.B. die Formulierung von komplexen Integritätsregeln, die die Zulässigkeit von Werten prüfen. Mit Datenbankprozeduren können Operationen auf Anwendungsobjekten bereitgestellt werden. Änderungen an diesen Regeln bzw. Operationen können dann an zentraler Stelle, nämlich in der Datenbankprozedur erfolgen und müssen nicht mehr in jeder Anwendung einzeln gemacht werden. Die Programme werden übersichtlicher und daher einfacher zu handhaben.

Desweiteren ist die Privilegienvergabe bei Einsatz von Datenbankstrukturen sehr einfach. Sie müssen nur das Aufrufprivileg vergeben, Privilegien für die angesprochenen Datenbankobjekte müssen Sie nicht vergeben.

### 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 Datenbankprozedur

Zum Anlegen einer Datenbankprozedur verwenden Sie die CREATE DBPROC-Anweisung.

CREATE DBPROC hotel.avg_price (IN zip CHAR(5), OUT avg_price FIXED(6,2)) AS
VAR sum FIXED(10,2); price FIXED(6,2); hotels INTEGER;
TRY
SET sum = 0; SET hotels = 0;
DECLARE dbproccursor 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 dbproccursor INTO :price;
SET sum = sum + price;
SET hotels = hotels + 1;
END;
CATCH
IF $rc <> 100 THEN STOP ($rc, 'unexpected error');
CLOSE dbproccursor;
IF hotels > 0 THEN SET avg_price = sum / hotels
ELSE STOP (100, 'no hotel found');

Die Datenbankprozedur avg_price bestimmt den durchschnittlichen Preis für Einzelzimmer in Hotels, die im angegebenen Postleitzahlenbereich liegen.

#### Erläuterung

● IN zip CHAR(5), OUT avg_price FIXED(6,2) : Eingabeparameter ist die Postleitzahl zip, Ausgabeparameter ist der durchschnittliche Preis avg_price.

● Nach dem Schlüsselwort AS werden die SQL-Anweisungen (in diesem Beispiel eine SELECT-Anweisung) und Kontrollstrukturen (in diesem Beispiel eine WHILE- und eine IF-Anweisung) definiert, die zum Ausführen der gewünschten Prozedur erforderlich sind.

● Nach dem Schlüsselwort VAR werden die innerhalb der Datenbankprozedur 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 dbproccursor 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 dbproccursor 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 dbproccursor.

Siehe auch:

SQL-Referenzhandbuch, CREATE DBPROC[EDURE]-Anweisung (create_dbproc_statement)

SQL-Referenzhandbuch, Routine (routine)

Systemtabellen auswerten, DBPROCEDURES

### Aufrufen einer Datenbankprozedur

Zum Aufrufen einer Datenbankprozedur verwenden Sie die CALL-Anweisung.

Wenn die Tabelle hotel mit den SQL-Anweisungen für das Schema HOTEL erzeugt und mit Daten gefüllt wurde, können Sie folgende CALL-Anweisung ausprobieren:

CALL hotel.avg_price (20005, :avg_price)

Ergebnis

Out(1)
135

Wenn ein formaler Parameter der Datenbankprozedur den Modus OUT besitzt, muss der korrespondierende Ausdruck einer Parameterspezifikation entsprechen. In der CALL-Anweisung finden Sie die Parameterspezifikation :avg_price.

Siehe auch:

SQL-Referenzhandbuch, CALL-Anweisung (call_statement)

### Löschen einer Datenbankprozedur

Zum Löschen einer Datenbankprozedur verwenden Sie die DROP DBPROC-Anweisung.

DROP DBPROC hotel.avg_price

Mit Hilfe dieser SQL-Anweisung löschen Sie die Definition der Datenbankprozedur.

Siehe auch:

SQL-Referenzhandbuch, DROP DBPROC[EDURE]-Anweisung (drop_dbproc_statement)

Weitere Beispiele zur Datendefinition