1 迴圈的概述
每個迴圈包括兩個部分:迴圈邊界和迴圈體。其中,迴圈邊界由一些pl/sql保留字組成。位於迴圈體外部的**不應該知道迴圈內部的工作。但是,迴圈是把雙刃劍,程式的效能問題很容易定位到迴圈。
2 迴圈的型別
2.1 簡單迴圈
語法:
loop
可執行的語句
end loop;
屬性: 屬性
描述why
1)不能確定迴圈會執行多少次
2)要求迴圈至少執行一次
when
exit或者exit when發生時結束
how通過exit或者exit when來結束
注釋:
1)離了exit或者exit when,簡單迴圈便是死迴圈
2)exit when和exit的運用場景:
只有乙個條件表示式決定迴圈是否應該結束時,使用exit when
loop
balance_remaining := account_balance(account_id);
exit when balance_remaining<1000;
end loop;
需要根據不同的退出條件來設定「返回值」時,在case語句中,使用exit
loop
case
when salary>=10000 and salary<=20000
then
give_bonus(employee_id,1500);
exit;
when salary>2000 and salary<40000
then
give_bonus(employee_id,1000);
exit;
when salary>=40000
then
give_bonus(employee_id,500);
exit;
else
give_bonus(employee_id,0);
exit;
end case;
end loop;
2.2 while迴圈
語法:
while condition
loop
可執行語句
end loop;
屬性: 屬性
描述why
1)事先無法確定迴圈的次數
2)你想通過條件來終止迴圈
3)迴圈體不是必須要執行的
when
條件判斷是在迴圈邊界處發生,每次進入迴圈體前都要進行這個判斷
how迴圈邊界的布林表示式的求值結果是false 、null
注釋:1)while迴圈是依賴於條件的,倘若condition是false或者null,那麼控制權就交割不到迴圈體手上
例子:
while mask_index <= mask_count
loop
begin
retval :=to_date(value_in,fmts(mask_index));
date_converted :=true;
exception
when others
then
mask_index :=mask_index+1;
end;
end loop;
2.3 for迴圈
2.3.1 數值型for迴圈
語法:
for loop_index in [reverse] lowest_number..highest_number
loop
可執行語句
end loop;
屬性: 屬性
描述why
如果只想有限次數的執行迴圈,但又不想過早的退出
when
迴圈索引超過迴圈上邊界時
how數值型for迴圈只要達到範圍區指定的迴圈次數,就會無條件結束
注釋:
1)loop_index會自動、隱士的被pl/sql引擎用乙個int型的區域性變數宣告
2)範圍部分使用的表示式,當且僅當迴圈開始時被求值一次,然後在整個生命週期內有效
3)迴圈體內改變範圍表示式使用的變數,對迴圈邊界沒任何作用
4)迴圈體內不要改變loop_index或者範圍邊界值,這是個相當不好的程式設計習慣
例子:
for loop_index in 1..100
loop
if mod(loop_index,2)=0
then
calc_values(loop_index);
end if;
end loop;
2.3.2 游標型for迴圈
語法:
for record in
loop
可執行語句
end loop;
屬性: 屬性
描述why
當要依次取出乙個游標中的每一行記錄並處理時
when
每次迴圈體執行後,pl/sql引擎會執行乙個取資料的操作,如果游標中的%notfound屬性為true時,迴圈便結束
how當游標中的所有記錄都取出後,游標型for迴圈就無條件結束
注釋:
1)record由pl/sql引擎隱士宣告,請不要再顯示的宣告乙個迴圈索引同名的record了
2)如果declare cursor時,select子句中一列是表示式,則必須為這個表示式指定別名
3)在迴圈體內訪問游標記錄的特定值是通過句點表示法
4)迴圈執行次數為游標所取的記錄數
例子:--動態重建索引
declare
cursor ind is select index_name from user_indexes;
begin
for cur in ind
loop
execute immediate
'alter index '||cur.index_name||' rebuild';
end loop;
end;
3 迴圈的標籤
定義:迴圈的別名
語法:<>
作用:1)使用tag可以明確的把迴圈的開頭和結束繫結在一起,提高了巢狀迴圈的可讀性
2)讓迴圈的index_loop更具規範化,無論是一條記錄還是乙個值 例子
:
<>
for year_number in 2012..2014
loop
<>
for month_number in 1..12
loop
if year_loop.year_number=2012
then ..
end if;
end loop month_loop;
end loop year_loop;
4 迴圈的技巧
1)index_loop使用可以自我說明的名稱
2)從已關閉的游標中獲取迴圈執行資訊
例子:
declare
book_count number :=0
for book_rec in book_cur (author_in => 'think,water')
loop
..process data..
book_count := book_cur%rowcount;
end loop;
if book_count > 10
then ..
pl sql 之三大迴圈的完全學習指南
1 迴圈的概述 每個迴圈包括兩個部分 迴圈邊界和迴圈體。其中,迴圈邊界由一些pl sql保留字組成。位於迴圈體外部的 不應該知道迴圈內部的工作。但是,迴圈是把雙刃劍,程式的效能問題很容易定位到迴圈。2 迴圈的型別 2.1 簡單迴圈 語法 loop 可執行的語句 end loop 屬性 屬性 描述wh...
C語言中的三大迴圈
一 c語言中的三大迴圈包括 while迴圈 do while迴圈和for迴圈 1 while迴圈 形式 while 表示式 執行 當表示式為真時執行迴圈體語句 當表示式為假時則跳出迴圈不再執行迴圈體語句 2 do while迴圈 形式 do while 表示式 執行 程式先執行迴圈體語句,然後判斷表...
Java的基本概念 三大迴圈
程式的三種結構 順序結構 分支結構和迴圈結構 1 正常迴圈的4個條件 迴圈條件 迴圈的入口 迴圈變數 用來控制迴圈次數 迴圈體 進行什麼樣的迴圈 改變迴圈變數的值 迴圈的出口 2 迴圈的適用條件 while迴圈 不明確迴圈次數 根據條件來決定是否迴圈 for迴圈 明確迴圈的次數 do while 不...