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语句。
循环体:这是一系列的位于循环边界内的可执行语句,这些语句在每一次循环内都要执行。