for..loop詳解

 For循環有2種,分別是數值型FOR循環和遊標型FOR循環:oop

 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關鍵字,而且循環上邊界和下邊界的順利無需改變:spa

 FOR even_number in reverse lowest .. highest
 loop
    dbms_output.put_line('now number:' || even_number);
 end loop;   

 

另外須要說明的是,數值型FOR循環中,索引老是以1爲單位遞增或遞減,因此若是咱們的循環條件並不是如此理想的平滑增加,咱們就必須用一些邏輯代碼或者技巧來調試

達到咱們的目的。code

      若是咱們須要對不少行記錄作處理時,就能夠使用遊標型FOR循環:blog

 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代碼難於跟蹤和調試。table

最後附上測試用的SQL:class

 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;
相關文章
相關標籤/搜索