PL/SQL 提供三种不同的循环:
- FOR 循环
- 简单循环
- WHILE循环
#FOR 循环
FOR循环适用于在循环前就已经明确知道需要循环的具体次数的情况。FOR循环有两种类型:
- FOR 数值循环
- FOR 光标循环
##FOR 数值循环
FOR数值循环通过指定一个数值区间来定义:
FOR loop_counter IN [REVERSE] lower_bound .. higher_bound
LOOP
sequence_of_statements;
END LOOP;
FOR循环自动创建迭代器整形的loop_counter
, 而不用人为声明,loop_counter
的作用域为FOR循环本身,从lower_bound
开始,每次循环加1,直到大于higher_bound
,循环退出。
lower_bound
必须小于或者等于higher_bound
,循环体才可能被执行,如果lower_bound
等于higher_bound
,循环体将执行一次,如果lower_bound
大于higher_bound
,循环体将不会被执行。
lower_bound
和higher_bound
可以是数值字面量,或者数值类型的变量,表达式。
可选的REVERSE
用于以相反的方向higher_bound .. lower_bound
产生迭代。
##FOR 光标循环
FOR 光标循环和FOR 数值循环很类似,只是循环是通过光标或者SELECT语句指定的。
FOR loop_record IN CURSOR
LOOP
sequence_of_statements;
END LOOP;
FOR loop_record IN (SELECT statement)
LOOP
sequence_of_statements;
END LOOP;
自动创建的迭代器为记录类型。
#简单循环
简单循环适合于无法提取预知需要迭代的具体次数的情况,简单循环的循环体会被无条件进入一次,结构为:
LOOP
sequence_of_statements;
END LOOP;
循环体可以用EXIT
,EXIT WHEN
,RETURN
退出,或者在循环体中产生异常的时候退出。
EXIT WHEN
在指定的条件condition
求值为TRUE时退出循环
LOOP
...
EXIT WHEN condition;
END LOOP;
EXIT
和RETURN
无条件退出循环
LOOP
...
EXIT;
END LOOP;
通过结合使用IF
和EXIT
或者RETURN
,可以实现EXIT WHEN
的效果。
#WHILE循环
WHILE循环类似与简单循环,但是其在进入循环体前会先检查WHILE condition
条件是否为TRUE,为TRUE进入循环体,否则循环体将不会被执行。
WHILE condition
LOOP
sequence_of_statements;
END LOOP;
每次迭代condition
都会被求值,直到求值结果为FALSE
或NULL
的时候,循环结束。
#单进单出
符合单进单出的循环,代码会显得更加简洁易懂。
EXIT
, EXIT WHEN
, RETURN
, GOTO
语句在所有的循环语句中都可以被使用于退出循环。但是对于FOR和WHILE循环来说,其本身就指定了出口,FOR在迭代固定此处后自动结束,WHILE在条件求值不为真时自动结束,如果在这两类循环中使用了能够导致循环退出的语句,则会造成这两类循环有多个出口。
确保单进单出的一个原则:如果可能,在FOR和WHILE循环中,不使用退出循环的语句。FOR循环只在需要迭代所有范围内的值的时候使用。
单进单出的规则适用于函数与过程,符合该规则的函数或过程代码将会更加简洁易懂。