Oracle PL SQL中的迴圈處理

2021-12-30 12:46:20 字數 3443 閱讀 2900

oracle pl/sql中的迴圈處理

今天來說下oracle中的迴圈迭代處理,因為從自己的部落格統計中看到,不少網友都搜尋了關鍵字"sql for迴圈",所以打算在這裡說下個人的理解。

www.2cto.com  

pl/sql也和我們常用的程式語言一樣,提供了while、for等迴圈,我們建幾個例子來說明演示下。

首先是while迴圈:

www.2cto.com  

--while迴圈

procedure loop_while

(   start_value in number,

end_value in number)is

current_value number := start_value;

begin

while current_value <=end_value

loop 

dbms_output.put_line('now number:' || current_value);

current_value:=current_value+1;

end loop;           

end loop_while;

指定迴圈的初始值和結束值之後,就可以看到將這2個值之間的數字一行行列印出來了;當然只要while迴圈條件的求值結果是true,迴圈就會繼續下去,

如果求值條件為false或者null,迴圈就會終止。這個迴圈條件每執行一次迴圈體之前都會先進行判斷,因此while迴圈並不能保證迴圈體一定能被執行。

所以如果我們無法提前預知所需要巡檢的次數的情況下,就可以使用while來進行迴圈處理。

for迴圈有2種,分別是數值型for迴圈和游標型for迴圈:  

--數值型for迴圈

procedure loop_num_for

(   lowest  in number,

highest in number)is

begin

for even_number in lowest .. highest --公升序

loop

--處理非平滑增長的索引

if mod(even_number,2)=0

then

dbms_output.put_line('now number:' || even_number);

end if;

end loop;    

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迴圈:  

--游標型for迴圈

procedure loop_cursor_for

isbegin

declare cursor userinfo_cur is select * from userinfo_table;

begin

for userinfo_rec in userinfo_cur

loop

dbms_output.put_line('username is:' || userinfo_rec.user_name);              

end loop;

end;

end loop_cursor_for;

當游標中的所有記錄都取出來後,for迴圈就會自動終止,這裡不用顯示open、close游標,pl/sql引擎會自動處理。

上面的迴圈語句都可以用exit 或者 exit when來終止其迴圈,但最好不要這樣做,因為這樣可能會造成迴圈的邏輯出現問題,最終造成sql**難於跟蹤和除錯。

最後附上測試用的sql: 迴圈

create or replace package body loop_test_demo is

--while迴圈

procedure loop_while(start_value in number, end_value in number) is

current_value number := start_value;

begin

while current_value <= end_value loop

dbms_output.put_line('now number:' || current_value);

current_value := current_value + 1;

end loop;

end loop_while;

--數值型for迴圈

procedure loop_num_for(lowest in number, highest in number) is

begin

for even_number in lowest .. highest

--公升序

loop

--dbms_output.put_line(even_number);

--處理非平滑增長的索引

if mod(even_number, 2) = 0 then

dbms_output.put_line('now number:' || even_number);

end if;

end loop;

--降序

for even_number in reverse lowest .. highest loop

dbms_output.put_line('now number:' || even_number);

end loop;

end loop_num_for;

--游標型for迴圈

procedure loop_cursor_for is

begin

declare

cursor userinfo_cur is

select * from greenet_user_info;

begin

for userinfo_rec in userinfo_cur loop

dbms_output.put_line('username is:' || userinfo_rec.user_name);

end loop;

end;

end loop_cursor_for;

end loop_test_demo;

Oracle pl sql基礎 迴圈

一 迴圈語法以及用法 1 loop的語法以及用法,如下 loop 處理程式 end loop 例子 declare v counter binary integer 1 定義變數 begin loop dbms output.put line v counter v counter v counte...

Oracle PL SQL之LOOP迴圈控制語句

在pl sql中可以使用loop語句對資料進行迴圈處理,利用該語句可以迴圈執行指定的語句序列。常用的loop迴圈語句包含3種形式 基本的loop while.loop和for.loop。loop語句的基本語法結構如下 loop statement.end loop label name 語法說明 l...

Oracle PL SQL之LOOP迴圈控制語句

在pl sql中可以使用loop語句對資料進行迴圈處理,利用該語句可以迴圈執行指定的語句序列。常用的loop迴圈語句包含3種形式 基本的loop while.loop和for.loop。loop語句的基本語法結構如下 loop statement.end loop label name 語法說明 l...