有两种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循环的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did225678