エラーや警告を受け取る簡単な手法の1つは、特定の条件が発生する度に特定の動作を実行するように設定することです。 一般的には以下のようになります。
EXEC SQL WHENEVER condition action END-EXEC.
conditionは以下のいずれかを取ることができます。
SQL文の実行中にエラーが発生する度に、指定した動作が呼び出されます。
SQL文の実行中に警告が発生する度に、指定した動作が呼び出されます。
SQL文が0行を受け取る、もしくは0行に影響する時、指定した動作が呼び出されます。 (この条件はエラーではありませんが、これを特別に扱いたい場合があるかもしれません。)
actionは以下のいずれかを取ることができます。
これは、実際のところ、その条件が無視されることを意味します。 これがデフォルトです。
指定したラベルに移動します (COBOLのGOTO文を使用します)。
標準エラーにメッセージを出力します。 これは、単純なプログラムやプロトタイプ作成時に役に立ちます。 メッセージの詳細は設定できません。
プログラムを終了させるSTOPを呼び出します。
指定した引数で、指定した関数を呼び出します。そのため、引数以外の構文(コンパイラ依存のものを含む)を含めてもかまいません。 ただし、以下の制約があります。
RETURNING句、ON EXCEPTION句、OVER FLOW句は使うことができません。
コールされた副プログラムでは、WHENEVER文を使うすべてのアクションにおいて、CONTINUEを指定しなければなりません。
標準SQLではCONTINUEとGOTO(とGO TO)のみを提供しています。
簡単なプログラムで使用してみたくなるような例を以下に示します。 警告が発生した場合に簡単なメッセージを表示し、エラーが発生した場合にプログラムを中断します。
EXEC SQL WHENEVER SQLWARNING SQLPRINT END-EXEC. EXEC SQL WHENEVER SQLERROR STOP END-EXEC.
EXEC SQL WHENEVER文はCOBOLの構文ではなく、SQLプリプロセッサのディレクティブです。 設定したエラーもしくは警告動作は、最初のEXEC SQL WHENEVERと条件を発生させたSQL文の間で、同一条件に異なる動作が設定されない限り、ハンドラを設定した箇所より後にある、すべての埋め込みSQL文に適用されます。 COBOLプログラムの制御フローは関係しません。 したがって、以下の2つのCOBOLプログラムの抜粋はどちらも望み通りの動作を行いません。
* * WRONG * ... IF VERBOSE = 1 THEN EXEC SQL WHENEVER SQLWARNING SQLPRINT END-EXEC END-IF. ... EXEC SQL SELECT ... END-EXEC. ... * * WRONG * ... CALL SET-ERROR-HANDLER. * (and execute "EXEC SQL WHENEVER SQLERROR STOP" in SET-ERROR-HANDLER) ... EXEC SQL SELECT ... END-EXEC. ...