Mit der DECLARE HANDLER-Anweisung wird ein Fehlerbehandlungsprogramm für die Handhabung von Ausnahmen erstellt.
Sie können Steuerroutinen sowohl in explizit deklarierten Bereichen (BEGIN...END) erstellen als auch in implizit deklarierten Bereichen (wie beispielsweise durch die ELSE-Klausel einer IF-Anweisung). Alle Deklarationen für Steuerroutinen müssen jedoch am Beginn eines Bereichs, vor allen anderen Anweisungen, stehen.
Tritt keine Ausnahme auf, hat die Steuerroutine keine Auswirkungen auf das Verhalten oder die Leistung eines SQL-Programms. Tritt eine Ausnahme auf, vergleicht WebSphere Message Broker den SQL-Status der Ausnahme mit dem der relevanten Steuerroutinen, bis die Ausnahme entweder den Knoten wieder verlässt (wie dies auch der Fall wäre, wenn keine Steuerroutinen vorhanden wären) oder bis die entsprechende Steuerroutine gefunden wird. In jedem einzelnen Bereich wird nach Steuerroutinen in der Reihenfolge gesucht, in der sie erstellt wurden, d. h. von der zuerst bis zu der zuletzt erstellten Steuerroutine. Die Bereiche werden vom innersten hin zum äußersten durchsucht.
Die in den DECLARE... HANDLER...-Anweisungen zur Verfügung gestellten SQL-Statuswerte können direkt mit dem SQL-Status einer Ausnahme verglichen werden oder mit Hilfe von Platzhalterzeichen. Damit Statuswerte direkt verglichen werden können, müssen Sie entweder VALUE oder einen Operator, für den keine Bedingungen erfüllt werden müssen, angeben. Für einen Vergleich mit Hilfe von Platzhalterzeichen werden das Unterstreichungszeichen und das Prozentzeichen (mit deren Hilfe einzelne bzw. mehrere Zeichen abgedeckt werden) sowie der LIKE-Operator angegeben. Bei der Verwendung von Platzhalterzeichen können alle Ausnahmen eines allgemeinen Typs behandelt werden, ohne dass die Ausnahmen alle einzeln aufgeführt werden müssen.
Wenn eine entsprechende Steuerroutine gefunden wurde, werden der SQLSTATE und andere spezielle Register aktualisiert (entsprechend den unten aufgeführten Regeln), und die Anweisung der Steuerroutine wird verarbeitet.
Da die Anweisung der Steuerroutine eine einzige Anweisung sein muss, handelt es sich in der Regel um eine zusammengesetzte Anweisung (wie beispielsweise BEGIN...END), die mehrere andere Anweisungen enthält. Es ist kein besonderes Verhalten in Zusammenhang mit diesen internen Anweisungen vorgegeben, und es bestehen auch keine Einschränkungen. Zu diesen internen Anweisungen gehören beispielsweise RETURN, ITERATE oder LEAVE; sie wirken sich auf die in ihnen enthaltenen Routinen und Schleifenkonstrukte genauso aus, als ob diese im Bereich selbst enthalten wären.
Steuerroutinen können wiederum Steuerroutinen für Ausnahmen enthalten, die in diesen übergeordneten Steuerroutinen selbst auftreten.
Jede Steuerroutine verfügt über ihre eigene Sonderregister SQLCODE, SQLSTATE, SQLNATIVEERROR und SQLERRORTEXT. Unmittelbar vor der Ausführung der ersten Anweisung der Steuerroutine treten sie in den Bereich ein, und ihre Werte werden gesetzt. Sie bleiben gültig, bis die letzte Anweisung der Steuerroutine ausgeführt wurde. Da SQLSTATE-Werte nicht von einer Steuerroutine in eine andere übernommen werden, können Steuerroutinen unabhängig voneinander erstellt werden.
Steuerroutinen übernehmen Ausnahmen und verhindern, dass sie den Empfangsknoten erreichen; dadurch wird die Transaktion nicht zurückgesetzt, sondern festgeschrieben. Eine Steuerroutine kann dies durch Verwendung einer RESIGNAL- oder THROW-Anwendung verhindern.
-- Löschen Sie die Tabellen, damit sie anhand der aktuellen Definition erneut erstellt werden können. -- Wenn das Programm noch nie ausgeführt wurde, werden Fehler auftreten, da -- nicht vorhandene Tabellen nicht gelöscht werden können. Diese Fehler werden ignoriert. BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE LIKE'%' BEGIN END; PASSTHRU 'DROP TABLE Shop.Customers' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Invoices' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Sales' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Parts' TO Database.DSN1; END;