WHENEVER ステートメント
WHENEVER ステートメントは、 指定した例外条件が発生した時点で実行するアクションを指定します。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、実行可能ステートメントではありません。 このステートメントは REXX ではサポートされていません。
許可
必要ありません。
構文
説明
- NOT FOUND
- SQLCODE が +100、または SQLSTATE が '02000' になる条件を指定します。
- SQLERROR
- SQLCODE が負になる条件を指定します。
- SQLWARNING
- 警告状態 (SQLWARN0 が 'W') または SQL 戻りコードが +100 以外の正の値になる条件を指定します。
- CONTINUE
- ソース・プログラムの次に続く命令を実行します。
- GOTO または GO TO host-label
- host-label で識別されるステートメントに制御を渡します。 host-label には、単一のトークンを指定します。 オプションとして、その先頭にコロンを付けることができます。 トークンの形式は、ホスト言語によって異なります。
- DO
- 関数呼び出し、break ステートメント、または continue ステートメントの形式で追加のアクションが実行されるようにします。
- function-name()
- 呼び出す C 関数を指定します。 この関数には void 戻り値が必要であり、引数は受け入れません。 関数名の最後は、小括弧「(」と「)」のセットである必要があります。 関数名は 255 バイトまでに制限されます。
関数名の解決は、C および C++ 組み込み SQL アプリケーションのコンパイル時に行われます。 データベース・プリコンパイラーでは、関数名の解決は行われません。
- BREAK
- C break ステートメントを指定します。 C break ステートメントにより、do、for、switch、または while ステートメント・ブロックから抜け出します。
- CONTINUE
- C continue ステートメントを指定します。 C continue ステートメントにより、do、for、switch、または while ステートメント・ブロックの次の反復に制御が渡されます。
- 呼び出す C 関数を指定します。 この関数には void 戻り値が必要であり、引数は受け入れません。 関数名の最後は、小括弧「(」と「)」のセットである必要があります。 関数名は 255 バイトまでに制限されます。
注
- WHENEVER NOT FOUND
- WHENEVER SQLERROR
- WHENEVER SQLWARNING
SQL ステートメントは、 ソース・プログラムでその SQL ステートメントよりも前に指定されている各タイプの最後の WHENEVER ステートメントの有効範囲内にあります。 いずれかのタイプの WHENEVER ステートメントが SQL ステートメントよりも前に指定されていない場合、 その SQL ステートメントは、CONTINUE が指定されたそのタイプの暗黙の WHENEVER ステートメントの有効範囲内にあります。
WHENEVER ステートメントを使用しない場合、実行中にエラー、警告、または例外状態が起こると、デフォルトのアクションとして処理が継続されることになります。
WHENEVER ステートメントは、対象とする SQL ステートメントより前に指定する必要があります。 そうしないと、その実行可能 SQL ステートメント用のエラー処理コードが追加で必要であることがプリコンパイラーに認識されません。 3 つの基本形式はいつでも任意に組み合わせてアクティブにすることができます。 これら 3 つの形式の宣言順序は重要ではありません。
無限ループ状態を避けるには、SQL ステートメントをハンドラー内部で実行する前に、 WHENEVER 処理が取り消されていることを確認してください。 WHENEVER 処理を取り消すには、WHENEVER SQLERROR CONTINUE ステートメントを使用します。
DO function-name() 構文、DO BREAK 構文、または DO CONTINUE 構文の使用に対する WHENEVER ステートメント・サポートは、バージョン 9.7 フィックスパック 6 以降で使用できます。
例
EXEC SQL WHENEVER SQLERROR GOTO HANDLERR;
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL WHENEVER NOT FOUND GO TO ENDDATA;
/* DO function_name */
EXEC SQL WHENEVER SQLERROR DO perform_error_action();
EXEC SQL WHENEVER SQLWARNING DO perform_warning_action();
EXEC SQL WHENEVER NOT FOUND DO perform_notfound_action();
/* DO BREAK */
EXEC SQL WHENEVER SQLERROR DO BREAK;
EXEC SQL WHENEVER SQLWARNING DO BREAK;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
/* DO CONTINUE */
EXEC SQL WHENEVER SQLERROR DO CONTINUE;
EXEC SQL WHENEVER SQLWARNING DO CONTINUE;
EXEC SQL WHENEVER NOT FOUND DO CONTINUE;