WHENEVER ステートメント

WHENEVER ステートメントは、 指定した例外条件が発生した時点で実行するアクションを指定します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込む方法のみ可能です。 これは、実行可能ステートメントではありません。 このステートメントは REXX ではサポートされていません。

許可

必要ありません。

構文

Read syntax diagramSkip visual syntax diagramWHENEVERNOT FOUNDSQLERRORSQLWARNINGCONTINUEGOTOGO TO:host-labelDOfunction-name()BREAKCONTINUE

説明

NOT FOUND、SQLERROR、または SQLWARNING の各節は、 例外条件のタイプの指定に使用されます。
NOT FOUND
SQLCODE が +100、または SQLSTATE が '02000' になる条件を指定します。
SQLERROR
SQLCODE が負になる条件を指定します。
SQLWARNING
警告状態 (SQLWARN0 が 'W') または SQL 戻りコードが +100 以外の正の値になる条件を指定します。
CONTINUE または GO TO の各節は、 指定したタイプの例外条件が生じた場合に行うアクションを指定します。
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 ステートメントにより、doforswitch、または while ステートメント・ブロックから抜け出します。
CONTINUE
C continue ステートメントを指定します。 C continue ステートメントにより、doforswitch、または while ステートメント・ブロックの次の反復に制御が渡されます。

WHENEVER ステートメントには、以下の 3 つのタイプがあります。
  • WHENEVER NOT FOUND
  • WHENEVER SQLERROR
  • WHENEVER SQLWARNING
プログラムの実行可能な SQL ステートメントはいずれも、 各タイプの暗黙のまたは明示的な WHENEVER ステートメントの有効範囲内にあります。 WHENEVER ステートメントの有効範囲は、プログラムのステートメントの実行順序ではなく、 ステートメントのリスト順序に関連しています。

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 以降で使用できます。

次の C の例では、エラーが発生した場合に HANDLERR へ進みます。 警告コードを生成された場合は、プログラムの通常フローを続行します。 データが戻されない場合には、ENDDATA に進みます。
   EXEC SQL WHENEVER SQLERROR GOTO HANDLERR;
   EXEC SQL WHENEVER SQLWARNING CONTINUE;
   EXEC SQL WHENEVER NOT FOUND GO TO ENDDATA;
C での DO function-name() 構文、DO BREAK 構文、または DO CONTINUE 構文の使用例を次に示します。
/* 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;