pl sql 之三大迴圈的完全學習指南

2021-09-30 15:08:57 字數 3908 閱讀 4026

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