好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle PL / SQL for loop循环

有两种PL / SQL FOR循环:数字FOR循环和游标FOR循环。

数字FOR循环是传统的。当循环开始时,FOR循环的迭代次数是已知的。

这里是数字FOR循环的一般语法:

      FOR loop index IN [REVERSE]  lowest number .. highest number 
     LOOP 
        executable statement(s) 
     END LOOP;  

您必须在LOOP和END LOOP关键字之间至少有一个可执行语句。

 

实例

下面的循环执行10次; loop_counter从1开始,结束于10:

           FOR loop_counter IN 1 .. 10 
          LOOP 
             --executable statements ... 
          END LOOP; 
 

下面的循环执行10次; loop_counter从10开始,结束于1:

 
          FOR loop_counter IN REVERSE 1 .. 10 
          LOOP 
             ---executable statements ... 
          END LOOP; 
 

这里是一个循环,甚至不执行一次。

 
          FOR loop_counter IN REVERSE 10 .. 1 
          LOOP 
             ---executable statements ... 
          END LOOP; 
 

以下循环对由变量和表达式中的值确定的范围执行:

 
FOR calc_index IN start_period_number .. 
           LEAST (end_period_number, current_period) 
LOOP 
   --executable statements ... 
END LOOP;  

 

实例2

循环范围的边界可以是文字,变量或表达式,但它们必须求值为数字。

 DECLARE
  first  INTEGER := 1; 
  last   INTEGER := 10; 
  high   INTEGER := 100; 
  low    INTEGER := 12; 
BEGIN 
  -- Bounds are numeric literals: 
 
  FOR j IN -5..5 LOOP 
    NULL; 
  END LOOP; 
 
  -- Bounds are numeric variables: 
 
  FOR k IN REVERSE first..last LOOP 
    NULL; 
  END LOOP; 
 
  FOR step IN 0..(TRUNC(high/low) * 2) LOOP 
    NULL; 
  END LOOP; 
END; 
/  

 

实例3

在FOR-LOOP语句中使用计数器的递增

 DECLARE 
  TYPE DateList IS TABLE OF DATE INDEX BY PLS_INTEGER; 
  dates DateList; 
BEGIN 
  FOR j IN 1..3 LOOP 
    dates(j*5) := SYSDATE; 
  END LOOP; 
END; 
/  

 

循环边界的动态范围

PL / SQL允许您通过使用变量的边界在运行时指定循环范围。

 CREATE TABLE temp ( 
  emp_no NUMBER, 
  email_addr VARCHAR2(50) 
); --   www  .ja  v  a 2  s  .  com

DECLARE 
  emp_count NUMBER := 4; 
BEGIN 
  
 
  FOR i IN 1..emp_count LOOP 
    INSERT INTO temp 
      VALUES(i, 'to be added later'); 
  END LOOP; 
END; 
/ 

select * from temp;

drop table temp; 

上面的代码生成以下结果:

 

注意

如果循环范围的下限大于上限,则不执行循环体。

使用现有变量作为循环变量

 DECLARE
  i NUMBER := 5; 
BEGIN 
  FOR i IN 1..3 LOOP 
    DBMS_OUTPUT.PUT_LINE ('Inside loop, i is ' || TO_CHAR(i)); 
  END LOOP; 
 
  DBMS_OUTPUT.PUT_LINE ('Outside loop, i is ' || TO_CHAR(i)); 
END; 
/  

上面的代码生成以下结果:

引用与内部计数器名称相同的外部计数器

 BEGIN 
<<outer_loop>> 
  FOR i IN 1..3 LOOP 
    <<inner_loop>> 
    FOR i IN 1..3 LOOP 
      IF outer_loop.i = 2 THEN 
        DBMS_OUTPUT.PUT_LINE 
          ( 'outer: ' || TO_CHAR(outer_loop.i) || ' inner: ' 
            || TO_CHAR(inner_loop.i)); 
      END IF; 
    END LOOP inner_loop; 
  END LOOP outer_loop; 
END; 
/ 
 

上面的代码生成以下结果:

 

EXIT的示例

您可以使用标签给循环命名。PL / SQL中的循环标签具有以下格式:

 <<label_name>> 
 

其中label_name是标签的名称,并且该循环标签紧接在LOOP语句之前出现:

 
     <<all_emps>> 
     FOR emp_rec IN emp_cur 
     LOOP 
        ... 
     END LOOP; 
 

EXIT语句使FOR循环提前完成。

 DECLARE
   v_employees employees%ROWTYPE; 
   CURSOR c1 is SELECT * FROM employees; 
BEGIN 
  OPEN c1; 
  -- Fetch entire row into v_employees record: 
  FOR i IN 1..10 LOOP 
    FETCH c1 INTO v_employees; 
    EXIT WHEN c1%NOTFOUND; 
    -- Process data here 
  END LOOP; 
  CLOSE c1; 
END; 
/ 
 

EXIT与FOR LOOP中的标签

 DECLARE
   v_employees employees%ROWTYPE; 
   CURSOR c1 is SELECT * FROM employees; 
BEGIN 
  OPEN c1; 
 
  <<outer_loop>> 
  FOR i IN 1..10 LOOP 
    -- Process data here 
    FOR j IN 1..10 LOOP 
      FETCH c1 INTO v_employees; 
      EXIT outer_loop WHEN c1%NOTFOUND; 
      -- Process data here 
    END LOOP; 
  END LOOP outer_loop; 
 
  CLOSE c1; 
END; 
/  

 

游标FOR循环

游标FOR循环是与显式游标相关联的循环。

下面是游标FOR循环的基本语法:

      FOR record IN { cursor_name | (explicit SELECT statement) } 
     LOOP 
        executable statement(s) 
     END LOOP; 
 

其中记录是由PL / SQL使用%ROWTYPE属性对由cursor_name指定的游标隐式声明的记录。

循环的游标示例

 DECLARE
   CURSOR c_my IS SELECT id, room_number FROM occupancy; 
   my_rec c_my%ROWTYPE; 
BEGIN 
   OPEN c_my; 
   LOOP 
      FETCH c_my INTO my_rec; 
      EXIT WHEN c_my%NOTFOUND; 
      update_bill(my_rec.id, my_rec.room_number); 
    END LOOP; 
    CLOSE c_my; 
END;  

查看更多关于Oracle PL / SQL for loop循环的详细内容...

  阅读:33次

上一篇

下一篇

第1节:Oracle PL / SQL CASE 语句    第2节:Oracle PL / SQL CHAR VARCHAR2    第3节:Oracle PL / SQL INTERVAL数据类型    第4节:Oracle PL / SQL loop循环    第5节:Oracle PL / SQL for loop循环    第6节:Oracle PL / SQL goto 语句    第7节:Oracle PL / SQL update更新数据    第8节:Oracle PL / SQL包    第9节:Oracle PL / SQL 存储过程    第10节:Oracle PL / SQL 函数    第11节:Oracle PL / SQL变量    第12节:Oracle PL / SQL变量范围    第13节:Oracle PL / SQL TIMESTAMP数据类型    第14节:Oracle PL / SQL 聚合函数大全    第15节:Oracle PL/SQL Views 视图    第16节:Oracle PL / SQL 表 table    第17节:Oracle PL/SQL Delete删除数据    第18节:Oracle PL/SQL Select 查询    第19节:Oracle PL/SQL 教程    第20节:Oracle PL / SQL注释    第21节:Oracle PL / SQL触发器Triggers    第22节:Oracle PL / SQL变量值    第23节:Oracle PL / SQL块结构    第24节:Oracle PL / SQL关联数组    第25节:Oracle PL / SQL文字    第26节:Oracle PL / SQL参数    第27节:Oracle PL / SQL运算符    第28节:Oracle PL/SQL NUMBER    第29节:Oracle PL/SQL if 语句    第30节:Oracle PL/SQL while循环    第31节:Oracle PL / SQL约束    第32节:Oracle PL / SQL 插入insert    第33节:Oracle PL / SQL数据类型    第34节:PL / SQL 分析函数大全