編寫迴圈控制結構時,使用者可以使用基本迴圈,WHILE迴圈和FOR迴圈等三種類型的迴圈語句,下面分別介紹使用這三種迴圈語句的方法。
1.基本迴圈
LOOP
statement1;
......
EXIT [WHEN condition];
END LOOP;
當使用基本迴圈時,無論是否滿足條件,語句至少會被執行一次,當condition為TRUE時,會退出迴圈,並執行END LOOP後的相應操作。當編寫基本迴圈時一定要包含EXIT語句,否則會陷入死迴圈。另外還應該定義迴圈控制變數,並且在迴圈體內修改迴圈控制變數的值。樣本:
SQL> declare
2 i int:=1;
3 begin
4 loop
5 insert into testloop values(i);
6 exit when i=10;
7 i:=i+1;
8 end loop;
9 end;
10 /
2.WHILE迴圈
基本迴圈至少要執行一次迴圈體內的語句,而對於WHILE迴圈來說,只有條件為TRUE時,才會執行迴圈體內的語句。WHILE迴圈以WHILE ...LOOP開始,以END LOOP結束。
WHILE condition LOOP
statement1;
statement2;
.....
END LOOP;
當condition為TRUE時,執行迴圈體內的語句,而當condition為FALSE或NULL時,會退出迴圈,並執行END LOOP後的語句。當使用WHILE迴圈時,應該定義迴圈控制變數,並在迴圈體內改變迴圈控制變數的值。樣本:
SQL> declare
2 i int:=1;
3 begin
4 while i<=10 loop
5 insert into testloop values(i);
6 i:=i+1;
7 end loop;
8 end;
9 /
3.FOR迴圈
當使用基本迴圈或WHILE迴圈時,需要定義迴圈控制變數,並且迴圈控制變數不僅可以使用NUMBER類型,也可以使用其他資料類型。當使用FOR迴圈時,ORACLE會隱含定義迴圈控制變數。
FOR counter in [REVERSE] lower_bound. .upper_bound LOOP
statement1;
statement2;
.......
END LOOP;
counter是迴圈控制變數,並且該變數由oracle隱含定義,不需要顯式定義。lower_bound和upper_bound分別對應於迴圈控制變數的下界值和上界值,預設情況下,當使用FOR迴圈時,每次迴圈時迴圈控制變數會自動增1.如果指定REVERSE選項,那麼每次迴圈時迴圈控制變數會自動減1。樣本:
SQL> begin
2 for i in reverse 1..10 loop
3 insert into testloop values(i);
4 end loop;
5 end;
4.嵌套迴圈和標號
嵌套迴圈是指在一個迴圈語句之中嵌入另一個迴圈語句,而標號(label)則用於標記嵌套塊或嵌套迴圈,通過在嵌套迴圈中使用標號,可以區分內層迴圈和外層迴圈,並且可以在內層迴圈中直接退出外層迴圈,在編寫時可以用<<label_name>>定義標號。樣本:
SQL> declare
2 result int;
3 begin
4 <<outer>>
5 for i in 1..100 loop
6 <<inter>>
7 for j in 1..100 loop
8 result:=i*j;
9 exit outer when result=1000;
10 exit when result=500;
11 end loop inter;
12 dbms_output.put_line(result);
13 end loop outer;
14 dbms_output.put_line(result);
15 end;
16 /
當執行以上PL/SQL塊時,如果result=1000,那麼直接退出外層迴圈,而result=500時只會退出內層迴圈。