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';