PL/SQL循环结构
由两部分组成:循环边界和循环体:例如:
简单循环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
<<outer>>
FOR outer index 1N 1 .. 5
LOOP
... executable statement...
<<inner>>
FOR inner index 1N 1 .. 5
LOOP
... executable statement...
CONTINUE outer;
END LOOP inner;
END LOOP outer;
END;
/