## Routine (routine)

Der als Routine (routine) bezeichnete Teil der CREATE DBPROC[EDURE]-Anweisung, CREATE TRIGGER-Anweisung, CREATE SYSTEM TRIGGER-Anweisung oder CREATE FUNCTION-Anweisung ist die Implementierung der Datenbankprozedur, des Triggers oder der Datenbankfunktion. Sie besteht aus optionalen Variablendeklarationen und Anweisungen.

### Syntax

<routine> ::= [<local_variables>] <statement_list>;

<local_variables> ::= VAR <local_variable_list>;
<local_variable_list> ::= <local_variable>
| <local_variable_list>; <local_variable>
<local_variable> ::= <variable_name> <data_type>
<variable_name> ::= <identifier>

<statement_list> ::= <statement> | <statement_list> ; <statement>

#### Kontrollstrukturen, Anweisungen und SQL-Anweisungen (statement)

<statement> ::= BEGIN <statement_list> END
| BREAK | CONTINUE | CONTINUE EXECUTE
| <if_statement>
| <while_statement>
| <assignment_statement>
| <case_statement>
| RETURN [<expression>]
| STOP (<expression> [,<expression>] )
| TRY <statement_list>; CATCH <statement>
| <routine_sql_statement>

<if_statement> ::= IF <search_condition> THEN <statement> [ELSE <statement>]
<while_statement> ::= WHILE <search_condition> DO <statement>
<assignment_statement> ::= [SET] <variable_name> = <expression>
<case_statement> ::= <simple_case_statement> | <searched_case_statement>

<routine_sql_statement> ::=
<call_statement>
| <close_statement>
| <create_table_temp>
| <declare_cursor_statement>
| <delete_statement>
| <drop_table_temp>
| <fetch_statement>
| <insert_statement>
| <lock_statement>
| <recursive_declare_cursor_statement>
| <select_statement>
| <single_select_statement>
| <subtrans_statement>
| <update_statement>

<create_table_temp> ::= <! <create_table_statement> für das Anlegen temporärer Tabellen, d.h. der Tabellenname table_name in der CREATE TABLE-Anweisung muss die Form TEMP.<identifier> haben !>

<drop_table_temp> ::= DROP TABLE TEMP.<identifier>

### Beispiele

SQL-Tutorial

● Datenbankprozeduren

● Datenbankfunktionen

● Datenbanktrigger

### Erläuterung

Die im Folgenden getroffenen Aussagen für Datenbankprozeduren gelten ebenfalls für Trigger bzw. Datenbankfunktionen.

#### Variablen

Die lokalen Variablen der Datenbankprozedur müssen vor der ersten Benutzung explizit unter Angabe eines Datentyps deklariert werden. Es sind nur die Datentypen BOOLEAN, CHAR[ACTER], DATE, FIXED, FLOAT, INT[EGER], NUMBER, REAL, SMALLINT, TIME, TIMESTAMP und VARCHAR zulässig. Die Variablen können nach ihrer Deklaration beliebig in SQL-Anweisungen und Anweisungen benutzt werden.

Jede Datenbankprozedur besitzt implizit die Variablen $RC, $ERRMSG und $COUNT.

Die $RC-Variable liefert nach der Ausführung einer SQL-Anweisung einen numerischen Fehlercode zurück. Der Wert 0 bedeutet, dass die SQL-Anweisung erfolgreich ausgeführt wurde.

Parallel zu $RC liefert die $ERRMSG-Variable eine maximal 80 Zeichen lange Erläuterung des Fehlers.

Die Anzahl der in einer SQL-Anweisung bearbeiteten Zeilen kann der $COUNT-Variablen entnommen werden. Im Fall einer QUERY-Anweisung kann diese Variable den Wert -1 haben, der bedeutet, dass eine unbekannte Anzahl von Sätzen, aber mindestens einer, das Ergebnis der QUERY-Anweisung bildet. Im Fall einer DELETE-Anweisung kann diese Variable den Wert -1 haben, der bedeutet, dass eine unbekannt große Anzahl von Sätzen gelöscht wurde, gegebenenfalls auch 0 Sätze.

Variablen kann mit Hilfe der Anweisung assignment_statement ein Wert zugewiesen werden.

#### Kontrollstrukturen

Die IF-Anweisung if_statement 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 WHILE-Anweisung while_statement ermöglicht die bedingte Wiederholung von Anweisungen. Solange die angegebene Suchbedingung zutrifft, wird die Anweisung ausgeführt. Insbesondere wird die Bedingung vor der ersten Ausführung der Anweisung geprüft. Gegebenenfalls wird die Anweisung also gar nicht ausgeführt. Durch Angabe von BREAK kann die Schleife sofort ohne Überprüfung der Bedingung verlassen werden. Die Angabe von CONTINUE innerhalb der Schleife bewirkt, dass die Bedingung sofort neu bewertet und die Schleife abhängig vom Resultat erneut durchlaufen oder verlassen wird.

Die CASE-Anweisung case_statement erlaubt die bedingt Anweisungsausführung abhängig von Suchbedingungen oder der Gleichheit von Operanden. Es werden einfache und allgemeine CASE-Anweisungen unterschieden.

#### RETURN

CREATE DBPROC- und CREATE TRIGGER-Anweisung: Die Angabe von RETURN ermöglicht das sofortige fehlerfreie Verlassen der umgebenden Datenbankprozedur.

CREATE FUNCTION-Anweisung: Die Angabe von RETURN <expression> ermöglicht das Verlassen der Datenbankfunktion bei gleichzeitiger Übergabe des Funktionswertes <expression>.

#### 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. Wird hier CONTINUE EXECUTE ausgeführt, erfolgt ein Sprung unmittelbar hinter die Anweisung, die den Fehler ausgelöst hat.

Durch Aufruf der STOP-Funktion wird die Ausführung der Datenbankprozedur sofort unterbrochen. Der Wert des ersten Parameters der STOP-Funktion ist die Rück- oder Fehlermeldung, die die Anwendung als Resultat des Aufrufs der Datenbankprozedur erhält. Zusätzlich kann ein Fehlertext geliefert werden.

#### SQL-Anweisungen (routine_sql_statement)

In den SQL-Anweisungen routine_sql_statement der Datenbankprozedur müssen Tabellen immer vollständig, d.h. unter Angabe des Schemas angegeben werden. Im Falle von SELECT-Anweisungen reicht die vollständige Angabe des Tabellennamens in der FROM-Klausel.

#### Restriktionen

Die Anweisungsfolge statement_list darf nicht mehr als 255 SQL-Anweisungen enthalten.

Die Länge einer SQL-Anweisung routine_sql_statement darf ca. 8 KB nicht überschreiten.