WHILE ステートメント
WHILE ステートメントは、指定した条件が真である間、 ステートメント、またはステートメントのグループの実行を繰り返します。
呼び出し
このステートメントは、以下の対象に組み込むことができます。
- SQL プロシージャー定義
- コンパウンド SQL (コンパイル済み) ステートメント
- コンパウンド SQL (インライン化) ステートメント
許可
WHILE ステートメントを呼び出すために、特権は必要ありません。 ただし、ステートメントの許可 ID には、 WHILE ステートメントに組み込まれている SQL ステートメントおよび検索条件を呼び出すために必要な特権がなければなりません。
構文
説明
- 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