WHENEVER legt die Reaktion auf Anweisungen fest, die mit einem SQLSTATE ≠ '00000' und ≠ '01xxx' beendet wurden.
WHENEVER ist keine ausführbare Anweisung.
Die WHENEVER-Anweisung kann mehrmals in einem Programm vorkommen. Die Angaben einer WHENEVER-Anweisung gelten für alle im Programmtext (nach Einfügen aller Includes) folgenden SQL- und Utility-Anweisungen bis zur nächsten WHENEVER-Anweisung für dieselbe Fehlerklasse.
Vor der ersten WHENEVER-Anweisung gilt WHENEVER...CONTINUE.
WHENEVER
{ SQLERROR | NOT FOUND }
{ CONTINUE | { GOTO | GO TO }[:]
sprungziel }
SQLERROR
Reaktion festlegen für:
SQLSTATE ≠ '00000', '01xxx' und '02xxx'.
NOT FOUND
Reaktion festlegen für:
SQLSTATE = '02xxx'.
CONTINUE
Programm wird nach SQLERROR bzw. NOT FOUND mit der folgenden Anweisung fortgesetzt. Mit CONTINUE kanns eine zuvor vereinbarte Aktion für dieselbe Fehlerklasse wieder aufgehoben werden.
Wenn ein Programmabschnitt für die Fehlerbehandlung auch SQL-Anweisungen enthält, sollte dieser Abschnitt mit einer WHENEVER-Anweisung mit CONTINUE-Klausel eingeleitet werden. Damit kann eine Endlosschleife bei erneutem Auftreten eines Fehlers vermieden werden.
sprungziel
Sprungziel in einem ESQL-Programm.
Die Klausel entspricht einer Sprunganweisung in der Wirtssprache (z.B. GO TO in COBOL).
sprungziel muss die Namenskonventionen für Sprungmarken der jeweiligen Wirtssprache erfüllen (siehe Handbuch „ ESQL-COBOL für SESAM/SQL-Server“).
Programm wird nach SQLERROR bzw. NOT FOUND an der durch sprungziel festgelegten Stelle fortgesetzt.
Der Doppelpunkt : wird nur noch wegen Aufwärtskompatibilität unterstützt.
Beispiele
Das Beispiel setzt das Programm fort mit dem Paragrafen SQLERR nach einer Anweisung, die beendet wurde mit einem SQLSTATE ≠ '00000', '01xxx' und '02xxx'.
WHENEVER SQLERROR GOTO SQLERR
Das nächste Beispiel zeigt den Einsatz der WHENEVER-Anweisung bei dem Lesen einer Cursortabelle mit FETCH. Vor dem Positionieren des Cursors wird ein Sprungziel vereinbart für den Fall, dass die angegebene Cursor-Position nicht existiert. Der Cursor wird innerhalb einer Schleife auf den jeweils nächsten Satz positioniert.
Die Sätze werden gelesen, bis das Ende der Cursortabelle erreicht ist. Existiert die angegebene Position nicht, wird ein entsprechender SQLSTATE gesetzt und das Programm an dem Sprungziel fortgesetzt, dass durch die WHENEVER-Anweisung festgelegt wurde.
Am Sprungziel wird die vereinbarte Aktion für die Fehlerbehandlung wieder aufgehoben.
WHENEVER NOT FOUND GOTO F-4
F-2.
FETCH cur_kontakte
INTO
:NACHNAME,
:VORNAME INDICATOR :INDVORNAME,
:ABTEILUNG INDICATOR :INDABTEILUNG
F-3.
Ausgeben des gelesenen Satzes, zu F-2. gehen
F-4.
WHENEVER NOT FOUND CONTINUE