Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


6.14.1 WHENEVERの形式と規則

〈この項の構成〉

(1) 機能

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

(2) 形式

 WHENEVER
  {SQLERROR|SQLWARNING|NOT FOUND}
  {CONTINUE|{GO TO|GOTO}〔:〕ホスト識別子
        |〔DO〕PERFORM〔:〕ホスト識別子
        |DO {break|continue|'命令文'}}

(3) オペランド

(a) SQLERROR

ユーザの誤りやHiRDBの異常によってSQLが正常に実行されなかったとき(SQL連絡領域のSQLCODE領域,及びSQLCODE変数に負の値が返されたとき)の処理を指示する場合に指定します。

(b) SQLWARNING

SQLは正常に実行されたが,ユーザに警告する状態を検知したとき(SQL連絡領域のSQLWARN0領域にWが返されたとき,又はSQL連絡領域のSQLCODE領域及びSQLCODE変数に100以外の正の値が返されたとき)の処理を指示する場合に指定します。

(c) NOT FOUND

表の検索で検索結果の検索する行がなくなったとき(SQL連絡領域のSQLCODE領域に100,SQLCODE変数に100,及びSQLSTATE変数に'02000''が返されたとき)の処理を指示する場合に指定します。

(d) CONTINUE

UAPの実行を続行させる場合に指定します。

(e) {GO TO|GOTO}〔:〕ホスト識別子

UAPの実行を分岐させる場合,次に示すホスト識別子によって分岐先を指定します。

  • ラベル(C言語の場合)

  • 節名,又は段落名(COBOL言語の場合)

(f) 〔DO〕PERFORM〔:〕ホスト識別子

指定した手続きを実行させる場合,次に示すホスト識別子によって実行させる手続きを指定します。オブジェクトのメソッドは指定できません。

  • 関数名(C言語の場合)

  • 節名,又は段落名(COBOL言語の場合)

(g) DO {break|continue|'命令文'}

UAPの実行を分岐,又は任意の命令文を実行します。continue,及び'命令文'は,C言語,及びC++言語の場合に使用できます。

DO break

break文を実行します。

DO continue

continue文を実行します。

DO '命令文'

文字列として記述したホスト言語の任意の命令文(引数を指定した関数呼出しなど)を実行します。

(4) 共通規則

  1. 埋込み例外宣言を指定しないと,すべてのリターンコードに対してCONTINUEが仮定されます。

  2. 埋込み例外宣言は,同じUAP中に複数個指定できます。

  3. SQLERRORの状態で,ROLLBACK文以外のSQLは実行できません。

  4. 手続き実行後の制御は,特異状態が発生したSQLの次の命令へ戻ります。

  5. 埋込み例外宣言で指定した処理の有効範囲は,ソースプログラム上の位置によって決まります。すなわち,ある一つの埋込み例外宣言で指定された処理は,ソースプログラム上の次の同じ特異状態の処理を指定した埋込み例外宣言までの間にあるすべてのSQLの実行結果で有効になります。

    埋込み例外宣言で指定した処理の有効範囲を,次の図に示します。

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

    [図データ]

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

    SQLERROR→NOT FOUND→SQLWARNING

(5) 留意事項

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

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

    図6‒2 WHENEVER文の記述例(その1)

    [図データ]

  2. SQLERROR指定のWHENEVER文によって,あるSQLの実行エラーで分岐した先で,ROLLBACK文を実行する場合,無限ループしないように注意してください。

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

    図6‒3 WHENEVER文の記述例(その2)

    [図データ]

  3. 埋込み例外宣言は,UAPの複数の関数にわたって有効です。

    WHENEVER文で指定したGOTO文の分岐先は,SQL文と同じ関数内に指定してください。関数外への分岐先を指定すると,コンパイル時にエラーになります。

    また,必要に応じて,関数ごとにWHENEVER文を宣言し直してください。

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

    図6‒4 WHENEVER文の記述例(その3)

    [図データ]

    図6‒5 WHENEVER文の記述例(その4)

    [図データ]

  4. WHENEVER文は,FREE CONNECTION HANDLEの前で宣言しないでください。

(6) 使用例