5.7 WHENEVER埋め込み例外宣言

<この節の構成>
(1) 機能
(2) 形式
(3) 共通規則
(4) 注意事項
(5) 使用例

(1) 機能

SQLの実行後,XDBがSQL連絡領域に設定したリターンコード(SQLCODE)によって,UAPの処理を宣言します。

(2) 形式

WHENEVER
  {SQLERROR|SQLWARNING|NOT FOUND}
  {CONTINUE|{GO TO|GOTO}〔:〕ホスト識別子
   |PERFORM〔:〕ホスト識別子}

(a) {SQLERROR|SQLWARNING|NOT FOUND}
SQLERROR
ユーザの誤りやXDBの異常によって,SQLが正常に実行されなかったとき(SQL連絡領域のSQLCODE領域およびSQLCODE変数に負の値が返されたとき)の処理を指示する場合に指定します。
SQLWARNING
SQLは正常に実行されたが,ユーザに警告する状態を検知したとき(SQL連絡領域のSQLWARN0領域に'W'が返されたとき,またはSQL連絡領域のSQLCODE領域およびSQLCODE変数に100以外の正の値が返されたとき)の処理を指示する場合に指定します。
NOT FOUND
表の検索で,検索する行がなくなったとき(SQL連絡領域のSQLCODE領域と,SQLCODE変数に100が返されたとき)の処理を指示する場合に指定します。
(b) {CONTINUE|{GO TO|GOTO}〔:〕ホスト識別子|PERFORM〔:〕ホスト識別子}
CONTINUE
UAPの実行を続行させる場合に指定します。
{GO TO|GOTO}〔:〕ホスト識別子
UAPの実行を分岐させる場合,次に示すホスト識別子によって分岐先を指定します。
  • 節名,または段落名
PERFORM〔:〕ホスト識別子
指定した手続きを実行させる場合,次に示すホスト識別子によって実行させる手続きを指定します。
  • 節名,または段落名

(3) 共通規則

  1. 埋め込み例外宣言を指定しないと,すべてのリターンコードに対してCONTINUEが仮定されます。
  2. 埋め込み例外宣言は,同じUAP中に複数個指定できます。
  3. SQLERRORに該当する状態で,かつ,SQL連絡領域のSQLWARN6が'W'である場合,SQLは実行できません。
  4. 手続き実行後の制御は,特異状態(SQLERRORなど)が発生したSQLの次の命令へ戻ります。
  5. 埋め込み例外宣言で指定した処理の有効範囲は,ソースプログラム上の位置によって決まります。つまり,ある一つの埋め込み例外宣言で指定された処理は,ソースプログラム上の次の同じ特異状態の処理を指定した埋め込み例外宣言までの間にあるすべてのSQLの実行結果で有効になります。
    埋め込み例外宣言で指定した処理の有効範囲を次の図に示します。

    図5-1 埋め込み例外宣言で指定した処理の有効範囲

    [図データ]

  6. SQLERROR,SQLWARNING,NOT FOUNDの有効範囲が重複した場合は,次に示す優先順位でSQLが処理されます。

    SQLERROR→NOT FOUND→SQLWARNING

(4) 注意事項

  1. WHENEVER文で宣言した処置が途中のSQLから不要になる場合,同じ特異状態に対する処置として,CONTINUE(処理を続行する)を指定したWHENEVER文を,不要にする位置に記述してください。
    WHENEVER文の記述例を次の図に示します。

    図5-2 WHENEVER文の記述例1

    [図データ]

    説明
    3.以降でNOT FOUNDになるSQL文がない場合は,NOT FOUNDになったときの処理が不要になるため,3.のWHENEVER文にはCONTINUEを指定します。
  2. 埋め込み例外宣言は,UAP中に記述している複数の関数にわたって有効になります。
    WHENEVER文で指定したGOTO文の分岐先は,SQLと同じ関数内に指定してください。関数外への分岐先を指定すると,コンパイル時にエラーになります。
    また,必要に応じて,関数ごとにWHENEVER文を宣言し直してください。
    WHENEVER文の記述例を図5-3および図5-4に示します。

    図5-3 WHENEVER文の記述例2

    [図データ]

    説明
    2.でSQLERRORが発生すると,1.で指定した分岐先3.は2.と同じ内部プログラム内にあるため,3.に制御が分岐します。
    4.でSQLERRORが発生すると,1.で指定した分岐先3.は4.と同じ内部プログラム内にないため,コンパイルエラーとなります。

    図5-4 WHENEVER文の記述例3

    [図データ]

    説明
    2.でSQLERRORが発生したときの分岐先3.と,5.でSQLERRORが発生したときの分岐先6.は,それぞれSQL文で同じ内部プログラムのため,分岐できます。

(5) 使用例

埋め込み例外宣言の使用例を次に示します。

(a) コーディング

EXEC SQL
 WHENEVER SQLERROR GO TO L1
END-EXEC.

(b) エラー判定と動作の制御

WHENEVER文の記述例を次の図に示します。

図5-5 WHENEVER文の記述例4

[図データ]