oracle学习-PL SQL 存储过程中循环
PL SPL 提供了3中不同類型的循環(huán)結(jié)構(gòu)
-- 實(shí)例:索引 loop_counter從1開始,到10 結(jié)束,循環(huán)共執(zhí)行10次 FOR loop_counter IN 1 .. 10 LOOP...可執(zhí)行語句... END LOOP; -- 索引loop_counter從10開始,到1結(jié)束,循環(huán)共執(zhí)行10次; FOR loop_counter IN REVERSE 1 .. 10 LOOP...可執(zhí)行語句... END LOOP; -- 循環(huán)的執(zhí)行范圍取決于變量或者表達(dá)式的值: FOR calc_index IN start_period_number .. LEAST(end_period_number, current_period) LOOP ...可執(zhí)行語句... END LOOP; --在這個例子中,循環(huán)的執(zhí)行次數(shù)是在運(yùn)行時候決定的。邊界值只會在循環(huán)開始之前被求值一次,然后在整個循環(huán)生命期內(nèi)都有效。?
- 簡單循環(huán)或者無限循環(huán)?
- FOR循環(huán)(數(shù)值循環(huán)和游標(biāo)循環(huán))
- WHILE循環(huán)
簡單循環(huán):LOOP關(guān)鍵字開始,以END LOOP語句結(jié)束,要靠循環(huán)體內(nèi)的EXIT、EXIT WHEN 或者 RETURN來退出循環(huán)(或者異常拋出)
【EXIT WHEN后面跟布爾表達(dá)式,沒有退出條件的話,就會變成無窮循環(huán)】
FOR循環(huán):要使用數(shù)值型FOR循環(huán),需要指定循環(huán)開始的整數(shù)值和結(jié)束整數(shù)值,PL/SQL會完成剩下的工作,迭代每一個中間取值,然后結(jié)束循環(huán);
【需要最少量的代碼、預(yù)先知道循環(huán)體需要執(zhí)行的固定次數(shù),這個范圍在FOR和LOOP兩個關(guān)鍵字之間已經(jīng)給出了。 ?如果只想有限次數(shù)的執(zhí)行一段代碼,又不想過早的結(jié)束循環(huán),就可以使用數(shù)值型的FOR循環(huán)】
游標(biāo)型的FOR循環(huán)使用相同的基本結(jié)構(gòu),但需要提供一個明確的游標(biāo)或者SELECT語句,而不是數(shù)值型FOR循環(huán)使用的整數(shù)的上下邊界。
【如果你需要取出游標(biāo)的每條記錄依次處理,就可以使用游標(biāo)FOR循環(huán)】
WHILE循環(huán):WHILE循環(huán)和簡單循環(huán)非常相似,一個關(guān)鍵的區(qū)別在于WHILE循環(huán)會在每次循環(huán)之前檢查是否滿足終止條件。
【下列場合使用WHILE循環(huán): a.你事先無法確定會循環(huán)多少次;b.你想通過條件來終止循環(huán);c.循環(huán)體不是必須要執(zhí)行的】
?
每個結(jié)構(gòu)包括兩部分:循環(huán)邊界和循環(huán)體。
關(guān)于簡單循環(huán)中,什么時候用EXIT WHEN,什么時候使用拆分的EXIT:
1.如果只有一個條件表達(dá)式?jīng)Q定循環(huán)是否應(yīng)該結(jié)束,這種情況下使用EXIT WHEN 最好
2.如果有多個退出條件,或者要根據(jù)不同的退出條語句件設(shè)置“返回值”時,使用IF或者CASE應(yīng)該更合適,在這些語句的一個或多個子句中使用EXIT語句。
?【REPEAT UNTIL】 PL SQL沒有
在循環(huán)中,可以適當(dāng)暫停(休眠) ?DBMS_LOCK.sleep(10); -- 10秒鐘內(nèi)不做任何事情
PL SQL并沒有提供可以指定特殊的累進(jìn)步幅得“步進(jìn)”的語法。在PL SQL的數(shù)值型FOR循環(huán)的各種變體中,遞進(jìn)的步幅總是以1為單位前進(jìn)或者后退。
如果希望一個循環(huán)體能夠以一種非平凡方式遞進(jìn)(即增長步幅不是1),你必須寫一些聰明的代碼,這里以簡單例子: 在循環(huán)中使用簡單的乘法,遞歸次數(shù)只需要一半:(不太會)
FOR even_number IN 1 .. 50 LOOP calc_values(even_number*2); END LOOP;循環(huán)的標(biāo)簽:可以通過標(biāo)簽給一個循環(huán)命名,格式: ?<<label_name>> ,循環(huán)的標(biāo)簽要緊靠在LOOP語句前面
<<all_emps>> FOR emp_rec IN emp_cur LOOP... END LOOP; -- 標(biāo)簽也可以跟在END LOOP保留詞的后面,這是可選的 <<year_loop>> WHILE year_number <= 1995 LOOP <<month_loop>>FOR month_number IN 1 .. 12LOOP ...END LOOP month_loop;year_number := year_number + 1; END LOOP year_loop;CONTINUE:使用這個語句可以從循環(huán)的本次迭代退出,緊接著立即進(jìn)入下一次迭代。(無條件的CONTINUE和有條件的CONTINUE WHEN)
?
轉(zhuǎn)載于:https://www.cnblogs.com/huiya/p/9258473.html
總結(jié)
以上是生活随笔為你收集整理的oracle学习-PL SQL 存储过程中循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARC 100 C - Linear A
- 下一篇: 宝塔面板数据库未授权访问(端口:888)