SQL 解説書

WHILE ステートメント

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

構文

>>-+----+--WHILE--search-condition--DO-------------------------->
   '-:label--'
 
      .-------------------------------.
      V                               |
>--------SQL-procedure-statement--;---+--END WHILE-------------->
 
>-----+--------+-----------------------------------------------><
      '-label--'
 

説明

label
WHILE ステートメントのラベルを指定します。 開始ラベルを指定した場合、 それを LEAVE および ITERATE ステートメントで指定することができます。 終了ラベルを指定する場合、開始ラベルと同じにしなければなりません。

search-condition
ループが実行される前に評価される条件を指定します。 条件が真であれば、ループ内の SQL-procedure-statement が処理されます。

SQL-procedure-statement
ループ内で実行する SQL ステートメント (複数も可) を指定します。

以下の例では、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


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]