SQL プロシージャー内のハンドラー

SQL プロシージャー実行時にエラーが発生した場合は、プロシージャーに何か他のアクションを実行するように指示するステートメントを組み込まなければ、プロシージャーは終了します。 これらのステートメントは、ハンドラーと呼ばれます。

ハンドラーは、外部 SQL アプリケーション・プログラム内の WHENEVER ステートメントに類似のものです。 ハンドラーは、エラーまたは警告が発生したとき、あるいは照会から戻される行がそれ以上ない場合に、何を行うのかを SQL プロシージャーに指示します。 さらに、特定の SQLSTATE 用のハンドラーを宣言できます。 ハンドラー内の SQLSTATE の数値によって SQLSTATE を 参照することも、SQLSTATE の名前を宣言してから、 その名前をハンドラー内で使用することもできます。

ハンドラー宣言の汎用書式は次のとおりです。
DECLARE handler-type HANDLER FOR condition SQL-procedure-statement;

一般に、ハンドラーを機能させるには、condition に一致するエラー発生時に 、SQL-procedure-statement を実行する方法をとり ます。 SQL プロシージャー・ステートメント が完了すると、Db2 は、ハンドラー・タイプに示されるアクションを実行します。

ハンドラーのタイプ

ハンドラー・タイプによって、SQL-procedure-statement の完了後の 発生内容が決まります。 ハンドラー・タイプは、CONTINUE か EXIT のいずれかで 宣言できます。
CONTINUE
SQL-procedure-statement が完了したら、エラーを起こしたステートメントの 後ろのステートメントから実行を継続することを指定します。
EXIT
SQL-procedure-statement が完了したら、ハンドラーを含んでいる コンパウンド・ステートメントが終了するところから実行を継続することを指定します。
例: CONTINUE ハンドラー: このハンドラーは、照会を満足させる行が それ以上ない場合にフラグ at_end を設定します。 その後このハンドラーは、行をまったく戻さなかった ステートメントの後ろから実行が継続されるようにします。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end=1;
例: EXIT ハンドラー: このハンドラーは、 条件 NO_TABLE の発生時にストリング 'Table does not exist' を 出力パラメーター OUT_BUFFER に入れます。 NO_TABLE は、前もって SQLSTATE 42704 (name は 未定義の名前) として宣言されています。 その後このハンドラーは、このハンドラーが宣言されているコンパウンド・ステートメントを SQL プロシージャーによって終了させます。
DECLARE NO_TABLE CONDITION FOR '42704';
⋮
DECLARE EXIT HANDLER FOR NO_TABLE
 SET OUT_BUFFER='Table does not exist';