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...