• 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;
  • 相关阅读:
    《程序设计与数据结构》(上)课程总结
    20172321 2017-2018-2 《程序设计与数据结构》实验五报告
    20172321 2017-2018-2 《程序设计与数据结构》实验4报告
    20172321 2017-2018-2 《程序设计与数据结构》第11周学习总结
    暑假App
    20172314 2018-2019-1《程序设计与数据结构》查找与排序实验报告
    团队作业——第二周
    安卓游戏开发——团队作业第一周
    20172314 2018-2019-1《程序设计与数据结构》第九周学习总结
    20172314 《程序设计与数据结构》实验报告——树
  • 原文地址:https://www.cnblogs.com/anzhi/p/7568305.html
Copyright © 2020-2023  润新知