For循环有2种,分别是数值型FOR循环和游标型FOR循环:

1 –数值型For循环procedure loop_num_for2 (3 lowest in number,4 highest in number5 )6 isbegin7 FOR even_number in lowest .. highest –升序 loop8 –处理非平滑增长的索引9 if mod(even_number,2)=0

10 then11 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_for2 isbegin3 declare cursor userinfo_cur is select *from userinfo_table;4 begin5 FOR userinfo_rec in userinfo_cur6 loop7 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 packagebody LOOP_TEST_DEMO IS2 –while循环3 procedure loop_while(start_value in number, end_value in number) is4 current_value number :=start_value;5 begin6 while current_value <=end_value loop7 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) is14 begin15 FOR even_number in lowest .. highest16 –升序 loop17 –dbms_output.put_line(even_number);18 –处理非平滑增长的索引19 if mod(even_number, 2) = 0then20 dbms_output.put_line(‘now number:’ ||even_number);21 end if;22 end loop;23 –降序24 FOR even_number in reverse lowest .. highest loop25 dbms_output.put_line(‘now number:’ ||even_number);26 end loop;27 end loop_num_for;28

29 –游标型For循环30 procedure loop_cursor_for is31 begin32 declare33 cursor userinfo_cur is34 select *from greenet_user_info;35 begin36 FOR userinfo_rec in userinfo_cur loop37 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;