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;