WHILE ステートメント

WHILE ステートメントは、指定した条件が真である間、 ステートメント、またはステートメントのグループの実行を繰り返します。

呼び出し

このステートメントは、以下の対象に組み込むことができます。
  • SQL プロシージャー定義
  • コンパウンド SQL (コンパイル済み) ステートメント
  • コンパウンド SQL (インライン化) ステートメント
コンパウンド・ステートメントは、SQL プロシージャー定義、SQL 関数定義、または SQL トリガー定義に組み込むことができます。 このステートメントは実行可能ステートメントではなく、動的に準備することはできません。

許可

WHILE ステートメントを呼び出すために、特権は必要ありません。 ただし、ステートメントの許可 ID には、 WHILE ステートメントに組み込まれている SQL ステートメントおよび検索条件を呼び出すために必要な特権がなければなりません。

構文

構文図を読む構文図をスキップするlabel:WHILEsearch-condition DOSQL-routine-statementEND WHILE label
SQL-routine-statement
構文図を読む構文図をスキップするSQL-procedure-statement;SQL-function-statement;

説明

label
WHILE ステートメントのラベルを指定します。 開始ラベルを指定した場合、 それを LEAVE および ITERATE ステートメントで指定することができます。 終了ラベルを指定する場合、そのラベルは開始ラベルと同じでなければなりません。
search-condition
ループが実行される前に評価される条件を指定します。 条件が真であれば、ループ内の SQL-procedure-statement が処理されます。
SQL-procedure-statement
ループ内で実行する SQL ステートメントを指定します。 SQL-procedure-statement を適用できるのは、SQL プロシージャーのコンテキスト内、またはコンパウンド SQL (コンパイル済み) ステートメント内に限られます。『コンパウンド SQL (コンパイル済み)』ステートメントの SQL-procedure-statement を参照してください。
SQL-function-statement
ループ内で実行する SQL ステートメントを指定します。 SQL-function-statement は、SQL トリガー、SQL 関数、または SQL メソッドに組み込める SQL 関数またはコンパウンド SQL (インライン化) ステートメントでのみ使用できます。『FOR』で、SQL-function-statement を参照してください。

以下の例では、WHILE ステートメントを使用して、 FETCH から SET ステートメントまでを繰り返します。 SQL 変数 v_counter の値が、 IN パラメーター deptNumber で識別される部門内の従業員数の半分より少ない間は、 WHILE ステートメントは FETCH および SET ステートメントを引き続き実行します。 条件が真でなくなれば、WHILE ステートメントは制御のフローを渡し、カーソルがクローズされます。
   CREATE PROCEDURE DEPT_MEDIAN
     (IN deptNumber SMALLINT, OUT medianSalary DOUBLE)
     LANGUAGE SQL
     BEGIN
       DECLARE v_numRecords INTEGER DEFAULT 1;
       DECLARE v_counter INTEGER DEFAULT 0;
       DECLARE c1 CURSOR FOR
         SELECT CAST(salary AS DOUBLE)
           FROM staff
           WHERE DEPT = deptNumber
           ORDER BY salary;
       DECLARE EXIT HANDLER FOR NOT FOUND
         SET medianSalary = 6666;
       SET medianSalary = 0;
       SELECT COUNT(*) INTO v_numRecords
         FROM staff
         WHERE DEPT = deptNumber;
       OPEN c1;
       WHILE v_counter < (v_numRecords / 2 + 1) DO
         FETCH c1 INTO medianSalary;
         SET v_counter = v_counter + 1;
       END WHILE;
       CLOSE c1;
     END