DECLARE HANDLER ステートメント

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 を組み込むことができます。この場合、有効範囲自体に含まれている場合と同様の影響を、含まれているルーチンやループ構成体に及ぼします。

ハンドラーには、そのハンドラー自体の内部で起きる例外のハンドラーを含めることができます。

ハンドラーのコードの処理が、追加の未処理の例外をスローせずに完了すると、正常なコードの実行が以下のように再開されます。
  • EXIT ハンドラーの場合、ハンドラーの有効範囲の後の最初のステートメントが、次に処理されます。
  • CONTINUE ハンドラーの場合、例外を生成したステートメントの後の直接含まれる最初のステートメントになります。

個々のハンドラーには、それぞれの 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;
関連概念
ESQL の概要
関連タスク
ESQL の開発
関連資料
RESIGNAL ステートメント
構文図: 使用可能なタイプ
ESQL のステートメント
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak20700_