スケーラブルデータベースサーバ HiRDB Version 8 SQLリファレンス

[目次][索引][前へ][次へ]

FOR文各行に対する文の繰返し

機能

表の各行に対してSQL文の実行を繰り返します。

形式

 
 〔開始ラベル:〕
 FOR ループ変数名 AS
  〔カーソル名 CURSOR 〔WITH HOLD〕FOR〕 
     カーソル指定 形式1
  〈排他オプション〉
   〔〔{WITH {SHARE|EXCLUSIVE}LOCK
     |WITHOUT LOCK〔{WAIT|NOWAIT}〕}〕
   〔{WITH ROLLBACK|NO WAIT}〕〕
     〔FOR{UPDATE 〔OF列名〔,列名〕…〕〔NOWAIT〕|READ ONLY}〕
     〔UNTIL DISCONNECT〕
  DO
  SQL手続き文;〔SQL手続き文;〕…
 END FOR 〔終了ラベル〕
 

オペランド

FOR文で指定するカーソル指定の規則
  • 導出列に名前のない列は指定できません。名前のない列を導出列として指定する場合は,AS句を指定し,導出列に対して別名を付与してください。
  • 導出列名が重複する導出列を指定できません。
  • 導出列に〔表指定.〕ROWを指定できません。
  • 導出列に,FROM句に平坦化の指定がない添字なし繰返し列を指定できません。
カーソル指定の導出列が次に示す項目から導き出された列で,AS 列名を省略した場合,その列は名前のない列となります。導出列がスカラ副問合せの場合,導出列名はスカラ副問合せの選択式の導出列名に依存します。
  • スカラ演算(ウィンドウ関数を含む)
  • 関数呼び出し
  • 集合関数
  • 定数
  • USER
  • CURRENT_DATE値関数
  • CURRENT_TIME値関数
  • CURRENT_TIMESTAMP値関数
  • コンポネント指定
  • GET_JAVA_STORED_ROUTINE_SOURCE指定
  • WRITE指定
  • SQL変数
  • SQLパラメタ

FOR文の中で指定するSQL手続き文の規則
  • FOR文のカーソルを指定したOPEN文,FETCH文,及びCLOSE文は指定できません。
  • ループ変数名を指定したLEAVE文は指定できません。
  • FOR文のカーソルがホールダブルカーソルではない場合,COMMIT文,ROLLBACK文,及びPURGE TABLE文は指定できません。また,CALL文でこれらを指定した手続きが呼び出された場合は実行時エラーとなります。
  • 指定したSQL手続き文は指定した順序で実行されます。SQL手続き文の実行でエラーが発生した場合,それ以降のSQL手続き文は実行されません。FOR文の実行も終了します。

共通規則

  1. 終了ラベルを指定する場合は,開始ラベルと同じ名称の文ラベルを指定してください。
  2. 文ラベル,及びループ変数名の有効範囲は,FOR文の開始から終了までの間です。そのFOR文中に含まれるほかの文の文ラベル,ループ変数名と同じ名称の文ラベル,及びループ変数名は指定できません。ただし,SQL手続き文中にハンドラ宣言がある場合,そのハンドラ宣言中は除きます。
  3. FOR文中で暗黙的に宣言したSQL変数,及び明示的に宣言したカーソルは,そのFOR文の最初に割り当てられ,最後に解放されます。
  4. FOR文で暗黙的に宣言したSQL変数,及び明示的に宣言したカーソルの有効範囲は,そのSQL変数及びカーソルが宣言されているFOR文の中になります。
  5. FOR文の中のSQL手続き文に複合文を指定した場合,及び複合文の中のSQL手続き文にFOR文を指定した場合,FOR文で暗黙的に宣言したSQL変数と,複合文の中で宣言したSQL変数が同じ名称のときは,内側のルーチン制御SQLの中では内側のルーチン制御SQLで宣言したSQL変数が有効となります。内側のルーチン制御SQLが終了したら,外側のルーチン制御SQLで宣言したSQL変数が有効となります。例を次に示します。

    [図データ]

  6. FOR文の中のSQL手続き文にFOR文を指定した場合,外側のFOR文で暗黙的に宣言したSQL変数と内側のFOR文で暗黙的に宣言したSQL変数が同じ名称のときは,内側のFOR文の中では内側のFOR文で宣言したSQL変数が有効となります。内側のFOR文が終了したら,外側のFOR文で宣言したSQL変数が有効となります。
  7. FOR文の中のSQL手続き文に複合文を指定した場合,及び複合文の中のSQL手続き文にFOR文を指定した場合,FOR文で宣言したカーソルと,複合文の中で宣言したカーソルが同じ名称のときは,内側のルーチン制御SQLの中では内側で宣言したカーソルが有効となります。内側のルーチン制御SQLが終了したら,外側で宣言したカーソルが有効となります。
  8. FOR文の中のSQL手続き文にFOR文を指定した場合,外側のFOR文で宣言したカーソルと内側のFOR文で宣言したカーソルが同じ名称のときは,内側のFOR文の中では内側のFOR文で宣言したカーソルが有効となります。内側のFOR文が終了したら,外側のFOR文で宣言したカーソルが有効となります。
  9. SQL手続きの実行中にエラーが発生した場合に,トランザクションが無効になるのは,そのエラーが暗黙的ロールバックありのときだけです。トリガ動作のSQL手続き文の実行中にエラーが発生した場合は,必ず暗黙的ロールバックとなります。
  10. FOR文,及び複合文のネスト数は,最大255です。

留意事項

  1. FOR文はSQL手続き中,及びトリガ中に指定できます。

使用例

表T1のデータのうち,列C1(INT型)の値が100以下のデータは表T2に代入し,それ以外は表T3に代入する手続き(PROC1)を定義します。

 
CREATE PROCEDURE PROC1 ()
FLBL :
FOR LVN AS SELECT C1,C2,C3 FROM T1 DO
 IF C1 <= 100 THEN
  INSERT INTO T2 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
 ELSE
  INSERT INTO T3 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
 END IF ;
END FOR FLBL

 

上記使用例で示したFOR文と等価なSQLは以下のSQLで実現できます。

 
CREATE PROCEDURE PROC1 ()
LVN :
BEGIN 
  DECLARE C1,C2,C3 INT ; 
  DECLARE FCN CURSOR FOR SELECT C1,C2,C3 FROM T1 ;
  DECLARE AT_END CHAR(1) DEFAULT 'N' ; 
  OPEN FCN ;
  FLBL :
  WHILE AT_END != 'Y' DO
    FETCH FCN INTO C1,C2,C3 ;
    IF SQLCODE = 100 THEN
      SET AT_END = 'Y' ;
    ELSE
      IF C1 <= 100 THEN
        INSERT INTO T2 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
      ELSE
        INSERT INTO T3 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
      END IF ;
    END IF ;
  END WHILE FLBL ;
 CLOSE FCN ;
END LVN