Oracle 遍歷游標(biāo)的四種方式匯總(for、fetch、while、BULK COLLECT)
1.情景展示
Oracle 遍歷游標(biāo)的四種方式(for、fetch、while、bulk collect+forall)
2.問(wèn)題分析
我們可以把游標(biāo)想象成一張表,想要遍歷游標(biāo),就要取到游標(biāo)的每行數(shù)據(jù),所以問(wèn)題的關(guān)鍵就成了:如何取到行數(shù)據(jù)?
3.解決方案
方式一:FOR 循環(huán)(推薦使用)
變形一:遍歷顯式游標(biāo)
/* 如果是在存儲(chǔ)過(guò)程外使用顯式游標(biāo),需要使用DECLARE關(guān)鍵字 */ DECLARE /*創(chuàng)建游標(biāo)*/ CURSOR CUR_FIRST_INDEX IS SELECT A.ID A_ID, --一級(jí)指標(biāo)ID A.INDEXNAME A_INDEXNAME --一級(jí)指標(biāo)名稱 FROM INDEX_A A ORDER BY A_ID; /*定義游標(biāo)變量,該變量的類型為基于游標(biāo)CUR_FIRST_INDEX的行記錄*/ ROW_CUR_FIRST_INDEX CUR_FIRST_INDEX%ROWTYPE; /*游標(biāo)處理*/ BEGIN /*遍歷顯式游標(biāo)*/ --FOR 循環(huán) FOR ROW_CUR_FIRST_INDEX IN CUR_FIRST_INDEX LOOP --循環(huán)體 DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","名稱":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}'); END LOOP; END;
執(zhí)行,輸出結(jié)果
變形二:遍歷隱式游標(biāo)(推薦使用)
for循環(huán)遍歷游標(biāo),其實(shí)又可以分為兩種方式,一種是顯式游標(biāo)的遍歷,另一種是隱式游標(biāo)的遍歷。
/* 如果是在存儲(chǔ)過(guò)程外使用隱式游標(biāo),如果用不到變量無(wú)需聲明DECLARE關(guān)鍵字 */ /*游標(biāo)處理*/ BEGIN /*遍歷隱式游標(biāo)*/ --FOR 循環(huán) FOR ROW_CUR_FIRST_INDEX IN (SELECT A.ID A_ID, --一級(jí)指標(biāo)ID A.INDEXNAME A_INDEXNAME --一級(jí)指標(biāo)名稱 FROM INDEX_A A ORDER BY A_ID) LOOP --循環(huán)體 DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","名稱":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}'); END LOOP; END;
隱式游標(biāo)相較于顯式游標(biāo)用法更加簡(jiǎn)單,無(wú)需聲明直接調(diào)用即可。
方式二:FETCH 循環(huán)
/*游標(biāo)聲明代碼和方式一一致,此處省略,直接展示游標(biāo)處理代碼*/ BEGIN /*遍歷游標(biāo)*/ --FETCH 循環(huán) OPEN CUR_FIRST_INDEX; --必須要明確的打開和關(guān)閉游標(biāo) LOOP FETCH CUR_FIRST_INDEX INTO ROW_CUR_FIRST_INDEX; EXIT WHEN CUR_FIRST_INDEX%NOTFOUND; --循環(huán)體 DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","名稱":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}'); END LOOP; CLOSE CUR_FIRST_INDEX; END;
方式三:WHILE 循環(huán)
/*游標(biāo)聲明代碼和方式一一致,此處省略,直接展示游標(biāo)處理代碼*/ BEGIN /*遍歷游標(biāo)*/ OPEN CUR_FIRST_INDEX; --必須要明確的打開和關(guān)閉游標(biāo) FETCH CUR_FIRST_INDEX INTO ROW_CUR_FIRST_INDEX; WHILE CUR_FIRST_INDEX%FOUND LOOP --循環(huán)體 DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","名稱":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}'); FETCH CUR_FIRST_INDEX INTO ROW_CUR_FIRST_INDEX; END LOOP; CLOSE CUR_FIRST_INDEX; END;
注意:使用while循環(huán)時(shí),需要fetch兩次。
方式四:BULK COLLECT+FORALL(速度最快)
/* 如果是在存儲(chǔ)過(guò)程外使用顯示游標(biāo),需要使用DECLARE關(guān)鍵字 */ /*聲明游標(biāo)*/ DECLARE /*創(chuàng)建顯式游標(biāo)*/ CURSOR CUR_FIRST_INDEX IS SELECT A.ID A_ID, --一級(jí)指標(biāo)ID A.INDEXNAME A_INDEXNAME --一級(jí)指標(biāo)名稱 FROM INDEX_A A ORDER BY A_ID; /*定義表類型,該表的表結(jié)構(gòu)為游標(biāo)CUR_FIRST_INDEX的行記錄(可以存儲(chǔ)多條游標(biāo)記錄)*/ TYPE TABLE_CUR_FIRST_INDEX IS TABLE OF CUR_FIRST_INDEX%ROWTYPE; /* 聲明表變量*/ TAB_FIRST_INDEX TABLE_CUR_FIRST_INDEX; /*游標(biāo)處理過(guò)程*/ BEGIN /*遍歷游標(biāo)*/ OPEN CUR_FIRST_INDEX; LOOP --將n行游標(biāo)數(shù)據(jù)放到表中 FETCH CUR_FIRST_INDEX BULK COLLECT INTO TAB_FIRST_INDEX LIMIT 1; -- 數(shù)據(jù)量太少,僅當(dāng)前測(cè)試使用哦,實(shí)際開發(fā)建議 500 左右 -- 退出條件 EXIT WHEN TAB_FIRST_INDEX.COUNT = 0; --循環(huán)表數(shù)據(jù) FORALL I IN TAB_FIRST_INDEX.FIRST .. TAB_FIRST_INDEX.LAST LOOP DBMS_OUTPUT.PUT_LINE('{"ID":"' || TAB_FIRST_INDEX(I).A_ID || '","名稱":"' || TAB_FIRST_INDEX(I).A_INDEXNAME || '"}'); END LOOP; END LOOP; CLOSE CUR_FIRST_INDEX; END;
4.總結(jié)
- 使用for循環(huán)的優(yōu)勢(shì)在于:
不需要手動(dòng)打開&關(guān)閉游標(biāo)(聲明游標(biāo)的開啟和關(guān)閉);
不需要手動(dòng)捕獲數(shù)據(jù)(自動(dòng)將數(shù)據(jù)fetch到記錄型變量);
不需要關(guān)注何時(shí)要退出,也就是不需要寫退出循環(huán)的滿足條件(遍歷完成就會(huì)退出)。
- 第4方式與前3種的區(qū)別在于:
前三種的游標(biāo)變量:ROW_CUR_FIRST_INDEX,只能存儲(chǔ)游標(biāo)的一條數(shù)據(jù);
第四種的表變量:TAB_FIRST_INDEX,可以存儲(chǔ)游標(biāo)的多條數(shù)據(jù)。
大數(shù)據(jù)批量處理的時(shí)候,第4種方式的優(yōu)勢(shì)將會(huì)凸顯出來(lái)。
本文作者:Marydon
原文鏈接:https://www.cnblogs.com/Marydon20170307/p/12869692.html
以上就是Oracle 遍歷游標(biāo)的四種方式匯總(for、fetch、while、BULK COLLECT)的詳細(xì)內(nèi)容,更多關(guān)于Oracle 遍歷游標(biāo)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Oracle數(shù)據(jù)庫(kù)游標(biāo)連接超出解決方案
- 詳解Oracle游標(biāo)的簡(jiǎn)易用法
- Oracle游標(biāo)的使用實(shí)例詳解
- Oracle中游標(biāo)Cursor基本用法詳解
- 詳解Oracle隱式游標(biāo)和顯式游標(biāo)
- Oracle存儲(chǔ)過(guò)程游標(biāo)用法分析
- Oracle出現(xiàn)超出打開游標(biāo)最大數(shù)的解決方法
- Oracle顯示游標(biāo)的使用及游標(biāo)for循環(huán)
- Oracle存儲(chǔ)過(guò)程返回游標(biāo)實(shí)例詳解
- Oracle 游標(biāo)使用總結(jié)
- Oracle使用游標(biāo)進(jìn)行分批次更新數(shù)據(jù)的6種方式及速度比對(duì)
相關(guān)文章
oracle刪除數(shù)據(jù)但表空間占用率沒(méi)有減小的情況
這篇文章主要介紹了oracle刪除數(shù)據(jù)但表空間占用率沒(méi)有減小的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Oracle導(dǎo)出文本文件的三種方法(spool,UTL_FILE,sqluldr2)
這篇文章主要介紹了Oracle導(dǎo)出文本文件的三種方法(spool,UTL_FILE,sqluldr2),需要的朋友可以參考下2023-05-05Oracle?listagg去重distinct的三種方式總結(jié)
這篇文章主要介紹了Oracle?listagg去重distinct的三種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11oracle中誤刪除表后恢復(fù)語(yǔ)句(FLASHBACK)
在操作過(guò)程中難免會(huì)誤操作,出現(xiàn)這種情況應(yīng)該怎樣解決呢?不要著急,下面與大家分享下誤刪的恢復(fù)語(yǔ)句2013-06-06