資源描述:
《隱式游標(biāo)和顯式游標(biāo)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、oracle隱式游標(biāo),顯示游標(biāo),游標(biāo)循環(huán),動(dòng)態(tài)SELECT語句和動(dòng)態(tài)游標(biāo),異常處理,自定義異常,關(guān)鍵字:oracle隱式游標(biāo)顯示循環(huán)動(dòng)態(tài)select語句游標(biāo)異常處理自定義游標(biāo)的概念:????游標(biāo)是SQL的一個(gè)內(nèi)存工作區(qū),由系統(tǒng)或用戶以變量的形式定義。游標(biāo)的作用就是用于臨時(shí)存儲(chǔ)從數(shù)據(jù)庫中提取的數(shù)據(jù)塊。在某些情況下,需要把數(shù)據(jù)從存放在磁盤的表中調(diào)到計(jì)算機(jī)內(nèi)存中進(jìn)行處理,最后將處理結(jié)果顯示出來或最終寫回?cái)?shù)據(jù)庫。這樣數(shù)據(jù)處理的速度才會(huì)提高,否則頻繁的磁盤數(shù)據(jù)交換會(huì)降低效率。?游標(biāo)有兩種類型:顯式游標(biāo)和隱式游標(biāo)。在前述程序中用到的SELECT...
2、INTO...查詢語句,一次只能從數(shù)據(jù)庫中提取一行數(shù)據(jù),對(duì)于這種形式的查詢和DML操作,系統(tǒng)都會(huì)使用一個(gè)隱式游標(biāo)。但是如果要提取多行數(shù)據(jù),就要由程序員定義一個(gè)顯式游標(biāo),并通過與游標(biāo)有關(guān)的語句進(jìn)行處理。顯式游標(biāo)對(duì)應(yīng)一個(gè)返回結(jié)果為多行多列的SELECT語句。?游標(biāo)一旦打開,數(shù)據(jù)就從數(shù)據(jù)庫中傳送到游標(biāo)變量中,然后應(yīng)用程序再從游標(biāo)變量中分解出需要的數(shù)據(jù),并進(jìn)行處理。?隱式游標(biāo)?如前所述,DML操作和單行SELECT語句會(huì)使用隱式游標(biāo),它們是:?*插入操作:INSERT。?*更新操作:UPDATE。?*刪除操作:DELETE。?*單行查詢操作:SE
3、LECT...INTO...。?當(dāng)系統(tǒng)使用一個(gè)隱式游標(biāo)時(shí),可以通過隱式游標(biāo)的屬性來了解操作的狀態(tài)和結(jié)果,進(jìn)而控制程序的流程。隱式游標(biāo)可以使用名字SQL來訪問,但要注意,通過SQL游標(biāo)名總是只能訪問前一個(gè)DML操作或單行SELECT操作的游標(biāo)屬性。所以通常在剛剛執(zhí)行完操作之后,立即使用SQL游標(biāo)名來訪問屬性。游標(biāo)的屬性有四種,如下所示。?Sql代碼?1.隱式游標(biāo)的屬性?返回值類型???意????義??2.SQL%ROWCOUNT????整型??代表DML語句成功執(zhí)行的數(shù)據(jù)行數(shù)??3.SQL%FOUND???布爾型?值為TRUE代表插入、刪除
4、、更新或單行查詢操作成功??4.SQL%NOTFOUND????布爾型?與SQL%FOUND屬性返回值相反??5.SQL%ISOPEN??布爾型?DML執(zhí)行過程中為真,結(jié)束后為假??【訓(xùn)練1】 使用隱式游標(biāo)的屬性,判斷對(duì)雇員工資的修改是否成功。?步驟1:輸入和運(yùn)行以下程序:?Sql代碼?1.SET?SERVEROUTPUT?ON???2.????????BEGIN??3.????????UPDATE?emp?SET?sal=sal+100?WHERE?empno=1234;??4.?????????IF?SQL%FOUND?THEN???
5、5.????????DBMS_OUTPUT.PUT_LINE('成功修改雇員工資!');??6.????????COMMIT;???7.????????ELSE??8.????????DBMS_OUTPUT.PUT_LINE('修改雇員工資失??!');??9.?????????END?IF;???1.????????END;??運(yùn)行結(jié)果為:?Sql代碼?1.修改雇員工資失敗!??2.????????PL/SQL?過程已成功完成。??步驟2:將雇員編號(hào)1234改為7788,重新執(zhí)行以上程序:?運(yùn)行結(jié)果為:?Sql代碼?1.成功修改雇員工資!
6、??2.????????PL/SQL?過程已成功完成。??說明:本例中,通過SQL%FOUND屬性判斷修改是否成功,并給出相應(yīng)信息。?顯式游標(biāo)?游標(biāo)的定義和操作?游標(biāo)的使用分成以下4個(gè)步驟。?1.聲明游標(biāo)?在DECLEAR部分按以下格式聲明游標(biāo):?CURSOR游標(biāo)名[(參數(shù)1數(shù)據(jù)類型[,參數(shù)2數(shù)據(jù)類型...])]?ISSELECT語句;?參數(shù)是可選部分,所定義的參數(shù)可以出現(xiàn)在SELECT語句的WHERE子句中。如果定義了參數(shù),則必須在打開游標(biāo)時(shí)傳遞相應(yīng)的實(shí)際參數(shù)。?SELECT語句是對(duì)表或視圖的查詢語句,甚至也可以是聯(lián)合查詢??梢詭HE
7、RE條件、ORDERBY或GROUPBY等子句,但不能使用INTO子句。在SELECT語句中可以使用在定義游標(biāo)之前定義的變量。?2.打開游標(biāo)?在可執(zhí)行部分,按以下格式打開游標(biāo):?OPEN游標(biāo)名[(實(shí)際參數(shù)1[,實(shí)際參數(shù)2...])];?打開游標(biāo)時(shí),SELECT語句的查詢結(jié)果就被傳送到了游標(biāo)工作區(qū)。?3.提取數(shù)據(jù)?在可執(zhí)行部分,按以下格式將游標(biāo)工作區(qū)中的數(shù)據(jù)取到變量中。提取操作必須在打開游標(biāo)之后進(jìn)行。?FETCH游標(biāo)名INTO變量名1[,變量名2...];?或?FETCH游標(biāo)名INTO記錄變量;?游標(biāo)打開后有一個(gè)指針指向數(shù)據(jù)區(qū),F(xiàn)ETCH語
8、句一次返回指針?biāo)傅囊恍袛?shù)據(jù),要返回多行需重復(fù)執(zhí)行,可以使用循環(huán)語句來實(shí)現(xiàn)??刂蒲h(huán)可以通過判斷游標(biāo)的屬性來進(jìn)行。?下面對(duì)這兩種格式進(jìn)行說明:?第一種格式中的變量名是用來從游標(biāo)中接收數(shù)據(jù)的變量