DECLARE HANDLER ステートメントは、例外を処理するエラー・ハンドラーを作成します。
ハンドラーを宣言する際には、有効範囲を明示的に宣言することもできますし (BEGIN...END)、暗黙的に宣言することもできます (IF ステートメントの ELSE 節など)。しかし、すべてのハンドラー宣言を、有効範囲の先頭つまり他のステートメントの前に一緒に置かなければなりません。
例外がない場合は、ハンドラーがあっても SQL プログラムの動作やパフォーマンスには影響しません。例外が起きると、WebSphere Message Broker は例外の SQL 状態を、関係のあるハンドラーに関連した SQL 状態と比較します。この比較は、例外がノードからなくなる (この場合はハンドラーがない場合と全く同様になる) か、一致するハンドラーが検出されるまで行われます。ハンドラーは、1 つの有効範囲内で、宣言されている順序で最初のハンドラーから最後のハンドラーに向かって検索されます。有効範囲は最内部から最外部に向かって検索されます。
DECLARE... HANDLER... ステートメントで指定された SQL 状態値は、例外の SQL 状態と直接比較するか、またはワイルドカード文字を使用して比較できます。状態値を直接比較するには、VALUE を指定するか、または条件演算子を指定しません。ワイルドカード比較を行うには、下線文字を使用して 1 文字ワイルドカードを表すかパーセント文字を使用して複数文字ワイルドカードを表し、LIKE 演算子を指定します。ワイルドカードの方式を使用すると、漏れなくリストしなくても、一般的なタイプの例外をすべて処理できます。
一致しているハンドラーが検出されると、SQLSTATE およびその他の特殊レジスターが (以下の規則に従って) 更新され、ハンドラーのステートメントが処理されます。
ハンドラーのステートメントは単一のステートメントでなければならないので、通常は複数の他のステートメントを含む 1 つの複合ステートメント (BEGIN...END など) になります。これらの内部ステートメントに関連した特殊な動作はないので、特別な制約事項はありません。例えば、RETURN、ITERATE、または LEAVE を組み込むことができます。この場合、有効範囲自体に含まれている場合と同様の影響を、含まれているルーチンやループ構成体に及ぼします。
ハンドラーには、そのハンドラー自体の内部で起きる例外のハンドラーを含めることができます。
個々のハンドラーには、それぞれの SQLCODE、SQLSTATE、SQLNATIVEERROR、および SQLERRORTEXT 特殊レジスターがあります。これらは有効範囲入り、その値はハンドラーの最初のステートメントが実行される直前に設定されます。これらの値は、ハンドラーの最後のステートメントが実行されるまで有効です。SQLSTATE 値はハンドラー間で持ち越されないので、ハンドラーは個別に作成できます。
ハンドラーが例外を吸収し、例外は入力ノードに達しないので、トランザクションはロールバックされずにコミットされます。このようにならないようにするには、ハンドラーで RESIGNAL ステートメントか THROW ステートメントを使用できます。
-- Drop the tables so that they can be recreated with the latest definition. -- If the program has never been run before, errors will occur because you -- can't drop tables that don't exist. We ignore these. 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;