条件の真理値に基づいて複合文で1つ以上のSQL文を繰り返し実行できます。
WHILE制御文は、次の環境の複合文で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
beginning-label:
制御ループに名前を割り当てます。LEAVE文とともに開始ラベルを使用することにより、WHILEループの終了を制御できます。終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと同じである必要があります。開始ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。compound-use-statement
複合文ブロックで許可されたSQL文を識別します。有効な文のリストは、「複合文」を参照してください。DO
制御ループの開始をマークします。END LOOP ending-label
LOOP制御ループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。オプションのending-label引数により、特に非常に複雑な複数文プロシージャ・ブロックの場合に、複数文プロシージャが読みやすくなります。
END WHILE ending-label
DO制御ループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。オプションのending-label引数により、特に非常に複雑な複数文プロシージャ・ブロックの場合に、複数文プロシージャが読みやすくなります。
LOOP
制御ループの開始をマークします。WHILE条件
複合文を実行できる回数を制御する検索条件を指定します。SQLでは、WHILE検索条件が評価されます。条件がTRUEに評価される場合は、関連するSQL文の順序が実行されます。エラー例外が発生しない場合、次の評価を実行するために制御はループの先頭にあるWHILE句に返されます。検索条件がTRUEに評価されるたびに、WHILE-DO文により、DO ... END WHILEブロック内に埋め込まれたSQL文が実行されます。検索条件がFALSEまたはUNKNOWNに評価されると、DO ... END WHILEブロックは無視され、制御は次の文に渡されます。
DO...END WHILEとLOOP...END LOOPはセマンティック的には同義ですが、DO...END WHILE構文はANSI/ISO SQL/PSM規格に準拠しています。
例1: WHILE文を使用したサブストリングのカウント
SQL> DECLARE :SUB_STR CHAR; SQL> DECLARE :SRC_STR CHAR(50); SQL> BEGIN cont> SET :SUB_STR='l'; cont> SET :SRC_STR='The rain in Spain falls mainly on the plain'; cont> END; SQL> SET FLAGS 'TRACE'; SQL> BEGIN cont>-- This procedure counts the occurrence of substrings cont> DECLARE :STR_COUNT INTEGER=0; cont> DECLARE :CUR_POS INTEGER = POSITION (:SUB_STR IN :SRC_STR); cont> WHILE :CUR_POS >0 DO cont> SET :STR_COUNT=:STR_COUNT + 1; cont> SET :CUR_POS = POSITION (:SUB_STR IN :SRC_STR FROM :CUR_POS + 1); cont> END WHILE; cont> TRACE 'FOUND ', :STR_COUNT, ' OCCURRENCES OF "', :SUB_STR, '"'; cont> END; ~Xt: Found 4 occurrences of "l"