zhufeng518 发表于 2018-9-10 10:25:09

ORACLE PL/SQL练习(六)

  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
页: [1]
查看完整版本: ORACLE PL/SQL练习(六)