for..loop详解

 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;
原文地址:https://www.cnblogs.com/anzhi/p/7568305.html