Wenn beim Zugriff auf eine externe Datenbank ein Fehler auftritt, stehen Ihnen zwei Optionen zur Verfügung:
Die erste Option ist die Standardmethode, d. h., die ESQL-Verarbeitung im aktuellen Knoten wird beendet. Die Ausnahme wird anschließend im Nachrichtenfluss zurückgeschickt, bis ein einschließender Abfangknoten oder der Empfangsknoten für diesen Nachrichtenfluss erreicht wird. Wenn die Ausnahme den Empfangsknoten erreicht, wird die vollständige Transaktion rückgängig gemacht.
Die zweite Option erfordert ein Verständnis von Datenbankrückkehrcodes und eine logische Vorgehensweise im Falle eines Fehlers. Um diese integrierte Datenbankfehlerverarbeitung zu aktivieren, müssen Sie das Merkmal Ausnahme für Datenbankfehler ausgeben des Filter-, Datenbank- oder Rechenknotens löschen. Der Knoten setzt daraufhin die Datenbankstatusanzeiger SQLCODE, SQLSTATE, SQLNATIVEERROR und SQLERRORTEXT entsprechend den Informationen vom Datenbankmanager, anstatt eine Ausnahme auszugeben.
Die Anzeiger enthalten nur dann Informationen, wenn ein Fehler (keine Warnung) auftritt, außer wenn Sie das Merkmal Warnungen als Fehler behandeln ausgewählt haben. Nach erfolgreichen Informationsdatenbankoperationen enthalten die Anzeiger die Standardwerte für eine erfolgreiche Ausführung.
Sie können die Werte in diesen Anzeigern in ESQL-Anweisungen verwenden, um Entscheidungen über die nächste Aktion zu treffen. Der Zugriff auf die Anzeiger erfolgt über die Funktionen SQLCODE, SQLSTATE, SQLNATIVEERROR und SQLERRORTEXT.
Wenn Sie mit einer internen Fehlerverarbeitung arbeiten möchten, müssen Sie die Statusanzeiger nach jeder Ausführung einer Datenbankanweisung überprüfen, um sicherzustellen, dass alle Fehler abgefangen und ausgewertet werden. Finden Sie bei der Verarbeitung der Anzeiger einen Fehler, den Sie nicht intern beheben können, können Sie eine neue Ausnahme auslösen, entweder um sie in einem übergeordneten Abfangknoten zu bearbeiten oder sie an den Empfangsknoten durchzulassen, damit die Transaktion rückgängig gemacht werden kann. Verwenden Sie dazu die ESQL-Anweisung THROW.
Möglicherweise wollen Sie den Sonderfall überprüfen, dass eine SELECT-Anweisung keine Daten zurückgibt. Dies wird nicht als Fehler betrachtet, und SQLCODE wird nicht gesetzt. Deshalb müssen Sie diesen Fall explizit testen. Diese Task wird im Abschnitt Von SELECT zurückgegebene Werte überprüfen beschrieben.
Das folgende ESQL-Beispiel zeigt, wie die vier Datenbankstatusfunktionen verwendet und die in einer Ausnahme zurückgegebenen Fehlerinformationen darin einbezogen werden:
DECLARE SQLState1 CHARACTER; DECLARE SQLErrorText1 CHARACTER; DECLARE SQLCode1 INTEGER; DECLARE SQLNativeError1 INTEGER; -- Make a database insert to a table that does not exist -- INSERT INTO Database.DB2ADMIN.NONEXISTENTTABLE (KEY,QMGR,QNAME) VALUES (45,'REG356','my TESTING 2'); --Retrieve the database return codes -- SET SQLState1 = SQLSTATE; SET SQLCode1 = SQLCODE; SET SQLErrorText1 = SQLERRORTEXT; SET SQLNativeError1 = SQLNATIVEERROR; --Use the THROW statement to back out the database and issue a user exception-- THROW USER EXCEPTION MESSAGE 2950 VALUES ( 'The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 , SQLErrorText1 );
Sie müssen keine Ausnahme auslösen, wenn Sie einen Datenbankfehler erkennen. Es kann sinnvoller sein, die zurückgegebenen Fehlerinformationen in der Verzeichnisstruktur der lokalen Umgebung (LocalEnvironment) zu speichern und einen Filterknoten in den Nachrichtenfluss einzufügen, der die Nachricht abhängig von den gespeicherten Werten an untergeordnete Nachrichtenflüsse für fehlerhafte oder erfolgreiche Vorgänge weiterleitet.
Das Musterprogramm Beispiel 'Flugreservierungen' enthält ein weiteres ESQL-Beispiel, bei dem diese Datenbankfunktionen verwendet werden.