【DB.PL/SQL】程序流程控制 —— 循环 ——LOOP, END LOOP, WHILE, FOR, CONTINUE

PL/SQL循环结构

由两部分组成:循环边界和循环体:例如:

【DB.PL/SQL】程序流程控制 —— 循环 ——LOOP, END LOOP, WHILE, FOR, CONTINUE_第1张图片


简单循环LOOP,END LOOP

语法如下:

LOOP
    executable statements
END LOOP;


终止简单循环 —— EXIT, EXIT WHEN

可以把EXIT或者EXIT WHEN语句放入循环体内,否则循环会无限;语法为:

EXIT;
EXIT WHEN condition;

condition是一个布尔表达式。


WHIEL循环

语法如下:

WHILE condition
  LOOP
      executable statements
END LOOP;

condition是一个布尔表达式,如果为TRUE,执行循环;为FALSE或NULL,循环终止。


数值型FOR循环

语法格式为:

FOR loop_index IN [REVERSE] lowest_number .. highest_number
LOOP
    executable statements
END LOOP;


  • 不要声明循环索引变量loop_index,PL/SQL会自动隐式的用一个INTEGER类型的局部变量作为循环索引,作用域仅限循环之内
  • 循环范围使用的表达式(lowest_number,highest_number)只会在循环开始时被求值依次。如果在循环体内改变了范围表达式使用的变量,对于范围边界没有任何作用
  • 使用 REVERSE 关键字可以使循环从上边界到下边界递减式进行
  • 递进的步长为 1;不能指定其他步长

示例:

FOR loop_counter IN 1 .. 10
LOOP
    ...可执行语句...
END LOOP;


游标FOR循环

游标型的FOR循环式和一个显示游标或者直接放在循环边界中的SELECT语句关联在一起的循环。

如果需要去除游标的每条记录依次处理,就可以使用游标FOR循环,这也是游标的主要用法。

语法格式为:

FOR record IN {cursor_name | explicit SELECT statement}
LOOP
    executable statements
END LOOP;

  • record是一个记录,是PL/SQL根据cursor_name这个游标的%ROWTYPE属性隐式的声明出来的
  • 当游标中的所有记录都被取出后,游标型FOR循环就会终止。也可以使用EXIT语句来终止循环,但不推荐这么做
  • 每次循环体执行后,PL/SQL会执行一个取数据操作,如果游标的%NOTFOUND属性等于TRUE,循环结束。如果游标中一行记录也没有,循环体也会结束
  • 当要依次取出一个游标中的每一行记录并处理时,就使用游标型FOR循环
  • 使用游标型FOR循环,可以省去操作游标时的OPEN, FETCH, CLOSE语句,也没有了%NOTFOUND属性的检查

使用示例:

DECLARE
    CURSOR occupancy_cur IS
        SELECT pet_i d , room_number
           FROM occupancy WHERE occupied_dt = TRUNC (SYSDATE);
BEGIN
    FOR occupancy_rec 1N occupancy_cur
    LOOP
        update_bill (occupancy_rec.pet _id , occupancy_rec.room_number);
    END LOOP;
END;


CONTINUE语句

Oracle11g提供了一个新特性 —— continue语句。

两种形式:无条件的CONTUNUE和有条件的CONTINUE WHEN。


还可以通过CONTINUE结束内层循环,紧接着继续外层循环的下一次迭代,需要使用标签给循环命名:

BEGIN
    <>
    FOR outer index 1N 1 .. 5
    LOOP
        ... executable statement...
        <>
        FOR inner index 1N 1 .. 5
        LOOP
            ... executable statement...
            CONTINUE outer;
        END LOOP inner;
    END LOOP outer;
END;
/










你可能感兴趣的:(DB.PL/SQL)