For循环有2种,分别是数值型FOR循环和游标型FOR循环:
1 --数值型For循环procedure loop_num_for 2 ( 3 lowest in number, 4 highest in number 5 ) 6 isbegin 7 FOR even_number in lowest .. highest --升序 loop 8 --处理非平滑增长的索引 9 if mod(even_number,2)=0 10 then 11 dbms_output.put_line('now number:' || even_number); 12 end if; 13 end loop; 14 end loop_num_for;
这种循环在开始的时候就已经知道循环的次数了,注意这里不需要声明循环索引,因为PL/SQL会自动隐式的用一个integer类型的局部变量作为它的循环索引;
如果要降序循环,必须加上reverse关键字,并且循环上边界和下边界的顺利无需改变:
FOR even_number in reverse lowest .. highest loop dbms_output.put_line('now number:' || even_number); end loop;
另外需要说明的是,数值型FOR循环中,索引总是以1为单位递增或递减,所以如果我们的循环条件并非如此理想的平滑增长,我们就必须用一些逻辑代码或者技巧来
达到我们的目的。
如果我们需要对很多行记录做处理时,就可以使用游标型FOR循环:
1 --游标型For循环procedure loop_cursor_for 2 isbegin 3 declare cursor userinfo_cur is select * from userinfo_table; 4 begin 5 FOR userinfo_rec in userinfo_cur 6 loop 7 dbms_output.put_line('username is:' || userinfo_rec.user_name); 8 end loop; 9 end; 10 end loop_cursor_for;
当游标中的所有记录都取出来后,FOR循环就会自动终止,这里不用显示OPEN、CLOSE游标,PL/SQL引擎会自动处理。
上面的循环语句都可以用EXIT 或者 EXIT WHEN来终止其循环,但最好不要这样做,因为这样可能会造成循环的逻辑出现问题,最终造成SQL代码难于跟踪和调试。
最后附上测试用的SQL:
1 create or replace package body LOOP_TEST_DEMO IS 2 --while循环 3 procedure loop_while(start_value in number, end_value in number) is 4 current_value number := start_value; 5 begin 6 while current_value <= end_value loop 7 dbms_output.put_line('now number:' || current_value); 8 current_value := current_value + 1; 9 end loop; 10 end loop_while; 11 12 --数值型For循环 13 procedure loop_num_for(lowest in number, highest in number) is 14 begin 15 FOR even_number in lowest .. highest 16 --升序 loop 17 --dbms_output.put_line(even_number); 18 --处理非平滑增长的索引 19 if mod(even_number, 2) = 0 then 20 dbms_output.put_line('now number:' || even_number); 21 end if; 22 end loop; 23 --降序 24 FOR even_number in reverse lowest .. highest loop 25 dbms_output.put_line('now number:' || even_number); 26 end loop; 27 end loop_num_for; 28 29 --游标型For循环 30 procedure loop_cursor_for is 31 begin 32 declare 33 cursor userinfo_cur is 34 select * from greenet_user_info; 35 begin 36 FOR userinfo_rec in userinfo_cur loop 37 dbms_output.put_line('username is:' || userinfo_rec.user_name); 38 end loop; 39 end; 40 end loop_cursor_for; 41 42 end LOOP_TEST_DEMO;