PL/SQL循環結構ide
PL/SQL提供了3種不一樣類型的循環結構:測試
簡單循環或者無限循環;ip
FOR循環(數值循環或者遊標循環);ci
WHILE循環。it
循環屬性:table
屬性 | 說明 |
循環如何結束 | 循環即反覆地執行代碼,該如何讓循環結束執行呢? |
何時測試是否該結束循環 | 這個結束測試是在循環一開始就作呢,仍是在循環的末尾進行?各自的後果是什麼? |
採用這種循環的緣由 | 是什麼因素促使你考慮選擇了某種循環? |
簡單循環:以LOOP關鍵字開始,以END LOOP關鍵字結束。要考循環體內的EXIT,EXIT WHEN或者RETURN來退出循環(或者有異常拋出)。class
CREATE OR REPLACE PROCEDURE display_multiple_years (循環
start_year_in IN PLS_INTEGERim
, end_year_in IN PLS_INTEGER異常
)
IS
l_current_year PLS_INTEGER := start_year_in;
BEGIN
LOOP
EXIT WHEN l_current_year > end_year_in;
display_total_sales (l_current_year);
l_current_year := l_current_year + 1;
END LOOP;
END display_multiple_years;
FOR循環
Oracle提供了數值型和遊標型的FOR循環,要使用數值型FOR循環,需指定循環開始的整數值和結束整數值。
PL/SQL會完成剩下的工做,迭代每個中間取值,而後結束循環。
DROP TABLE sales_data
/
CREATE TABLE sales_data (year INTEGER, sales_amount NUMBER)
/
CREATE OR REPLACE PROCEDURE display_total_sales (year_in IN PLS_INTEGER)
IS
BEGIN
DBMS_OUTPUT.put_line ('Total for year ' || year_in);
END display_total_sales;
/
CREATE OR REPLACE PROCEDURE display_multiple_years (
start_year_in IN PLS_INTEGER
, end_year_in IN PLS_INTEGER
)
IS
l_current_year PLS_INTEGER := start_year_in;
BEGIN
LOOP
EXIT WHEN l_current_year > end_year_in;
display_total_sales (l_current_year);
l_current_year := l_current_year + 1;
END LOOP;
END display_multiple_years;
/
CREATE OR REPLACE PROCEDURE display_multiple_years (
start_year_in IN PLS_INTEGER
, end_year_in IN PLS_INTEGER
)
IS
BEGIN
FOR l_current_year IN start_year_in .. end_year_in
LOOP
display_total_sales (l_current_year);
END LOOP;
END display_multiple_years;
遊標型的FOR循環使用相通的基本結構,但須要提供一個明確地遊標或者SELECT語句,而不是數值型FOR循環使用的整數的上下邊界。
CREATE OR REPLACE PROCEDURE display_multiple_years (
start_year_in IN PLS_INTEGER
, end_year_in IN PLS_INTEGER
)
IS
BEGIN
FOR l_current_year IN (SELECT *
FROM sales_data
WHERE year BETWEEN start_year_in AND end_year_in)
LOOP
-- This procedure is now accepted a record implicitly declared
-- to be of type sales_data%ROWTYPE...
display_total_sales (l_current_year.year);
END LOOP;
END display_multiple_years;
WHILE循環
WHILE循環和簡單循環很是類似,一個關鍵的區別在於WHILE循環會在每次循環以前檢查是否知足終止條件,循環體內的代碼有可能一次也不會執行。
CREATE OR REPLACE PROCEDURE display_multiple_years (
start_year_in IN PLS_INTEGER
, end_year_in IN PLS_INTEGER
)
IS
l_current_year PLS_INTEGER := start_year_in;
BEGIN
WHILE (l_current_year <= end_year_in)
LOOP
display_total_sales (l_current_year);
l_current_year := l_current_year + 1;
END LOOP;
END display_multiple_years;
每一個循環結構都包括兩部分:循環邊界和循環體
循環邊界由一些保留字組成,包括初始化循環,終止循環的條件,終止循環的END LOOP語句。
循環體:這是一系列的位於循環邊界內的可執行語句,這些語句在每一次循環內都要執行。