PL/SQL循环结构


PL/SQL提供了3种不同类型的循环结构:


简单循环或者无限循环;


FOR循环(数值循环或者游标循环);


WHILE循环。


循环属性:

                 属性                 说明
循环如何结束循环即反复地执行代码,该如何让循环结束执行呢?
什么时候测试是否该结束循环这个结束测试是在循环一开始就做呢,还是在循环的末尾进行?各自的后果是什么?
采用这种循环的原因是什么因素促使你考虑选择了某种循环?

                                        

                          

            

简单循环:以LOOP关键字开始,以END LOOP关键字结束。要考循环体内的EXIT,EXIT WHEN或者RETURN来退出循环(或者有异常抛出)。


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;


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语句。


循环体:这是一系列的位于循环边界内的可执行语句,这些语句在每一次循环内都要执行。