PL/SQL循環
可能有一種情況,當需要執行的代碼塊的幾個多次。在一般情況下,語句順序執行:一個函數的第一條語句,首先執行,然后是第二個...等等。
編程語言提供了各種控制結構,允許更多復雜的執行路徑。
循環語句可以讓我們執行語句多次或一個組,下面是在大多數編程語言循環語句的一般形式:

PL/ SQL提供了循環以下類型的處理循環的要求。點擊以下鏈接查看詳細信息。
循環類型 | 描述 |
---|---|
PL/SQL基礎循環 | 在這個循環結構,語句序列封閉在LOOP和END LOOP語句之間。在每次迭代中,語句序列被執行,然后在循環的頂部恢復控制 |
PL/SQL WHILE循環 | 重復聲明語句或一組,而給定的條件為真,它測試條件執行循環體前 |
PL/SQL FOR循環 | 執行語句序列多次和簡寫管理該循環變量的代碼 |
PL/SQL內嵌循環 | 可以使用一個或多個循環中的任何其它基本回路,同時或循環 |
標記一個PL/SQL循環
PL/ SQL循環可以被標記。標記應該用雙尖括號括起來(<<和>>),並出現在LOOP語句的開頭。標簽名稱也可以出現在循環語句結束。可以使用標簽在EXIT語句從循環退出。
下面的程序說明了這個概念:
DECLARE i number(1); j number(1); BEGIN << outer_loop >> FOR i IN 1..3 LOOP << inner_loop >> FOR j IN 1..3 LOOP dbms_output.put_line('i is: '|| i || ' and j is: ' || j); END loop inner_loop; END loop outer_loop; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
i is: 1 and j is: 1 i is: 1 and j is: 2 i is: 1 and j is: 3 i is: 2 and j is: 1 i is: 2 and j is: 2 i is: 2 and j is: 3 i is: 3 and j is: 1 i is: 3 and j is: 2 i is: 3 and j is: 3 PL/SQL procedure successfully completed.
循環控制語句
循環控制語句改變其正常的順序執行。當執行離開范圍,在該范圍內創建的所有對象自動被銷毀。
PL/ SQL支持以下控制語句。標記循環也采取了循環外的控制。點擊以下鏈接查看他們的詳細資料。
控制語句 | 描述 |
---|---|
EXIT語句 | 在EXIT語句END LOOP后立即完成返回,控制進到該語句 |
CONTINUE語句 | 將導致循環跳過其主體的其余部分,並立即重新測試其使用情況聲明之前 |
GOTO語句 | 控制權轉移給標簽的語句。雖然不建議在程序中使用GOTO語句 |
PL/SQL基本循環語句
基本的循環結構封裝在LOOP和END LOOP語句之間語句序列。隨着每次迭代,語句順序被執行,然后在循環的頂部控制過程。
語法:
PL/SQL編程語言的一個基本循環的語法是:
LOOP Sequence of statements; END LOOP;
在這里,聲明(S)的序列可以是單個語句或語句塊。 EXIT指令或EXIT WHEN語句需要退出循環。
示例:
DECLARE x number := 10; BEGIN LOOP dbms_output.put_line(x); x := x + 10; IF x > 50 THEN exit; END IF; END LOOP; -- after exit, control resumes here dbms_output.put_line('After Exit x is: ' || x); END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
10 20 30 40 50 After Exit x is: 60 PL/SQL procedure successfully completed.
可以使用EXIT WHEN語句,而不是EXIT語句:
DECLARE x number := 10; BEGIN LOOP dbms_output.put_line(x); x := x + 10; exit WHEN x > 50; END LOOP; -- after exit, control resumes here dbms_output.put_line('After Exit x is: ' || x); END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
10 20 30 40 50 After Exit x is: 60 PL/SQL procedure successfully completed.
PL/SQL WHILE循環語句
WHILE循環語句在PL/SQL編程語言,只要給定的條件為真,則執行目標語句多次。
語法:
WHILE condition LOOP sequence_of_statements END LOOP;
示例:
DECLARE a number(2) := 10; BEGIN WHILE a < 20 LOOP dbms_output.put_line('value of a: ' || a); a := a + 1; END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 PL/SQL procedure successfully completed.
PL/SQL FOR循環語句
FOR循環重復的控制結構,可以有效地編寫需要執行的特定次數的循環。
語法:
FOR counter IN initial_value .. final_value LOOP sequence_of_statements; END LOOP;
下面是控制在一個流程的循環:
-
初始步驟首先被執行,並且只有一次。這一步可以聲明和初始化任何循環控制變量。
-
接着,condition,initial_value.. final_value 進行計算。如果為true,則執行循環體。如果為false,在循環體不執行,只是之后的for循環流量控制跳轉到下一條語句。
-
循環體的執行后,計數器變量的值被增加或減少。
-
條件現在重新計算。如果為true,循環執行的過程重復(循環體,然后增加步,然后再次條件)。之后條件為false,則FOR-LOOP終止。
以下是PL/SQL for循環的一些特點:
-
initial_value 和 循環變量 或計算器 final_value 可以是字面值,變量或表達式,但必須計算結果為數字。否則,PL/SQL就會拋出預定義異常VALUE_ERROR。
-
initial_value不必為1; 但是循環計數器增量(或減量)必須為1。
-
PL/SQL允許動態確定在運行時的循環范圍。
示例:
DECLARE a number(2); BEGIN FOR a in 10 .. 20 LOOP dbms_output.put_line('value of a: ' || a); END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 value of a: 20 PL/SQL procedure successfully completed.
反轉FOR循環語句
缺省情況下,迭代前進從初始值到最終值,大體是由上界到下界約束。可以通過使用REVERSE關鍵字順序相反。在這種情況下,迭代前進的其他方式。每次迭代后循環計數器遞減。
但是,必須寫的范圍邊界在升序(非下降)的順序。下面的程序說明了這一點:
DECLARE a number(2) ; BEGIN FOR a IN REVERSE 10 .. 20 LOOP dbms_output.put_line('value of a: ' || a); END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
value of a: 20 value of a: 19 value of a: 18 value of a: 17 value of a: 16 value of a: 15 value of a: 14 value of a: 13 value of a: 12 value of a: 11 value of a: 10 PL/SQL procedure successfully completed.
PL/SQL嵌套循環
PL/SQL允許使用一個循環內嵌套另一個循環。下面的內容展示幾個例子來說明這個概念。
在PL/SQL嵌套基本LOOP語句的語法如下:
LOOP
Sequence of statements1 LOOP Sequence of statements2 END LOOP; END LOOP;
在PL/SQL 循環FOR語句嵌套的語法如下:
FOR counter1 IN initial_value1 .. final_value1 LOOP sequence_of_statements1 FOR counter2 IN initial_value2 .. final_value2 LOOP sequence_of_statements2 END LOOP; END LOOP;
在Pascal嵌套WHILE 循環語句的語法如下:
WHILE condition1 LOOP sequence_of_statements1 WHILE condition2 LOOP sequence_of_statements2 END LOOP; END LOOP;
示例:
下面的程序使用一個基本嵌套循環,找出2-100中的素數:
DECLARE i number(3); j number(3); BEGIN i := 2; LOOP j:= 2; LOOP exit WHEN ((mod(i, j) = 0) or (j = i)); j := j +1; END LOOP; IF (j = i ) THEN dbms_output.put_line(i || ' is prime'); END IF; i := i + 1; exit WHEN i = 50; END LOOP; END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
2 is prime 3 is prime 5 is prime 7 is prime 11 is prime 13 is prime 17 is prime 19 is prime 23 is prime 29 is prime 31 is prime 37 is prime 41 is prime 43 is prime 47 is prime PL/SQL procedure successfully completed.