天天看點

Oracle循環語句

PL/SQL有四種類型的循環:簡單循環、WHILE循環、FOR循環以及遊标FOR循環。在這裡我們主要讨論前三種,除此之外,還将讨論Oracle 11g中新引入的CONTINUE語句。

一、 簡單循環

       LOOP

             STATEMENT 1;

             STATEMENT 2;

             ...

             STATEMENT N;

        END LOOP;

        上述語句會無限制執行,因為沒有語句指定何時可以終止循環。是以,簡單循環稱為無限循環。

        一般循環會有退出條件。退出條件有兩種形式:EXIT 和 EXIT WHEN。l兩者是等價的。文法分别如下:

        LOOP                                               LOOP 

              STATEMENT 1;                                  STATEMENT 1;

              STATEMENT 2;                                  STATEMENT 2;

              IF   CONDITION  THEN                        EXIT WHEN CONDITION;

                    EXIT;                                   END LOOP;

              END IF;

         END LOOP;

         如下所示:

DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   LOOP
      v_counter := v_counter+1;
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
      IF v_counter = 5 THEN       -->> EXIT語句
         EXIT;
      END IF;
   END LOOP;
END;       
DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   LOOP
      v_counter := v_counter+1;
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
      EXIT WHEN v_counter = 5;        -->> EXIT WHEN語句
   END LOOP;
END;      

二、 WHILE循環

       WHILE循環的結構如下所示:

       WHILE CONDITION LOOP

              STATEMENT 1;

              STATEMNET 2;

              ...

              STATEMENT N;

        上例簡單循環的例子可改寫如下:

DECLARE
   v_counter BINARY_INTEGER := 0;
BEGIN
   WHILE v_counter < 5 LOOP
      v_counter := v_counter+1; 
      DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
   END LOOP;
END;      

       在WHILE循環體中,同樣可以使用EXIT和EXIT WHEN語句以提前終止循環

三、 整型值FOR循環

       其結構如下:

       FOR loop_counter IN [REVERSE] lower_limit..upper_limit LOOP

       END LOOP;

       變量loop_counter是隐含定義的索引變量。不需要在PL/SQL語句塊的聲明部分定義循環計數器。這個變量時循環結構定義的。lower_limit和upper_limit是兩個整數數字或者在運作時計算結果為整數值的表達式,雙點号(..)是範圍操作符。如果使用IN REVERSE,則循環計數器會從upper_limit到lower_limit。

       上例簡單循環的例子可改寫如下:

BEGIN
FOR v_counter IN 1..5 LOOP
   DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
END LOOP;
END;      

       上述讨論的EXIT和EXIT WHEN語句也可以在FOR循環的循環體中使用。

四、 CONTINUE語句

       CONTINUE語句有兩種形式:CONTINUE和CONTINUE WHEN

       CONTINUE文法如下:

       IF CONTINUE_CONDITION THEN

           CONTINUE;

       END IF;

       CONTINUE WHEN文法如下:

       CONTINUE WHEN CONTINUE_CONDITION;

       二者等效。

       舉例如下,求1到10内偶數的乘積。

DECLARE
  v_sum number := 1;
BEGIN
  FOR i IN 1..10 LOOP
    IF MOD(i,2) != 0 THEN
      CONTINUE;
    END IF;
    v_sum := v_sum*i;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('The number is = '||v_sum);
END;      

五、嵌套循環

     我們已經讨論過三種類型的循環:簡單循環、WHILE循環以及FOR循環。任何一種循環都可以嵌套在其他循環中。

     試舉一例:

DECLARE
  v_counter1 INTEGER :=0;
  v_counter2 INTEGER;
BEGIN
  WHILE v_counter1 < 3 LOOP
      DBMS_OUTPUT.PUT_LINE('v_counter1: '||v_counter1);
      v_counter2 := 0;
      LOOP
         DBMS_OUTPUT.PUT_LINE('v_counter2: '||v_counter2);
         v_counter2 := v_counter2+1;
         EXIT WHEN v_counter2 >= 2;
      END LOOP;
      v_counter1 := v_counter1+1;
  END LOOP;
END;      

 六、循環标簽

       循環标簽出現在循環的開始處,在循環語句的結尾處使用。在嵌套循環中,循環标簽很有必要,因為這會大大提升代碼的可讀性。

       在某些場合,必須使用循環标簽,如下例所示:     

BEGIN
  <<outer>>
  FOR v_counter IN 1..3 LOOP
    <<inner>>
    FOR v_counter IN 1..2 LOOP
        DBMS_OUTPUT.PUT_LINE('outer.v_counter '||outer.v_counter);
        DBMS_OUTPUT.PUT_LINE('inner.v_counter '||inner.v_counter);
    END LOOP inner;
  END LOOP outer;
END;      

        在這裡我們用了循環标簽,因為内、外部循環都使用了相同的循環計數器v_counter。為了引用v_counter的内部直和外部值,就要使用循環标簽。當然,循環标簽的名稱可任意取。

上一篇: 記錄

繼續閱讀