資源描述:
《oracle游標(biāo)的使用》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第十二章光標(biāo)的使用光標(biāo)的概念Oracle光標(biāo)是一種用于輕松的處理多行數(shù)據(jù)的機(jī)制。當(dāng)PL/SQL光標(biāo)查詢返回多行數(shù)據(jù)時,這些記錄組被稱為結(jié)果集。Oracle將這種活動集存儲在您創(chuàng)建的顯示定義的已命名的光標(biāo)中。沒有光標(biāo),Oracle開發(fā)人員必須單獨(dú)地、顯式地取回并管理光標(biāo)查詢選擇的每一條記錄。12.1光標(biāo)的定義與使用顯式光標(biāo)處理需四個PL/SQL步驟:cursor光標(biāo)名稱is查詢語句;open光標(biāo)名稱;Fetch光標(biāo)名稱into變量列表;Close光標(biāo)名稱;12.1光標(biāo)的定義與使用例1.declarecursorc1isselectename,salfromempwherer
2、ownum<11;v_enamevarchar2(10);v_salnumber(7,2);beginopenc1;fetchc1intov_ename,v_sal;whilec1%foundloopdbms_output.put_line(v_ename
3、
4、to_char(v_sal));fetchc1intov_ename,v_sal;endloop;closec1;end;12.1光標(biāo)的定義與使用2.光標(biāo)屬性%found布爾型屬性,當(dāng)最近一次讀記錄時成功返回,則值為true%nofound布爾型屬性,與%found相反.%isopen布爾型屬性,當(dāng)光標(biāo)已打開時返回t
5、rue.%rowcount數(shù)字型屬性,返回已從光標(biāo)中讀取得記錄數(shù).12.1光標(biāo)的定義與使用3.參數(shù)化光標(biāo)在聲明光標(biāo)時,將未確定的參數(shù)說明成變量,在使用光標(biāo)時給出光標(biāo)變量的具體值(相當(dāng)于實參)使得語句可以按照給出的條件進(jìn)行查詢。12.1光標(biāo)的定義與使用例2:DECLARECursorc1(view_patternvarchar2)ISSelectview_namefromall_viewsWhereview_namelikeview_pattern’
6、
7、%ANDrownum<=10Orderbyview_name;Vnamevarchar2(40);BEGINForI1in
8、c1(‘DBA’)loopDBMS_OUTPUT.PUT_LINE(I1.view_name);ENDloop;END;12.1光標(biāo)的定義與使用處理隱式光標(biāo)所有的SQL語句在上下文區(qū)內(nèi)部都是可執(zhí)行的,因此都有一個光標(biāo)指向上下文區(qū),此光標(biāo)就是所謂的SQL光標(biāo)(SQLcursor),與顯式光標(biāo)不同,SQL光標(biāo)不被程序打開和關(guān)閉。12.1光標(biāo)的定義與使用例3:--節(jié)自在線代碼nomat1.sqlBEGINUPDATEroomsSETnumber_seats=100WHEREroom_id=99980;--如果更新沒有匹配則插入一新行IFSQL%NOTFOUNDTHENINSER
9、TINTOrooms(room_id,number_seats)VALUES(99980,100);ENDIF;END;12.1光標(biāo)的定義與使用例4:--節(jié)自在線代碼nomat2.sqlBEGINUPDATEroomsSETnumber_seats=100WHEREroom_id=99980;--如果更新沒有匹配則插入一新行IFSQL%ROWCOUNT=0THENINSERTINTOrooms(room_id,number_seats)VALUES(99980,100);ENDIF;END;12.1光標(biāo)的定義與使用例5:--節(jié)自在線代碼nodata.sqlDECLAREV
10、_roomdatarooms%ROWTYPE;BEGINSelect*intov_roomdatafromroomsWhereroom_id=-1;IFSQL%NOFOUNDTHENINSERTINTOtemp_table(char_col)VALUES(‘NotFound!‘);ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENINSERTINTOtemp_table(char_col)VALUES(‘NotFound!exceptionhandle.‘);END;12.2光標(biāo)循環(huán)在高級語言編程和PL/SQL編程中,經(jīng)常使用“提取循環(huán)(fetchl
11、oop)”來實現(xiàn)逐行提取所需數(shù)據(jù)的方法。12.2光標(biāo)循環(huán)LOOP和ENDLOOP來實現(xiàn)簡單循環(huán)。DECLAREV_studentIDstudents.id%TYPE;V_firstNamestudents.first_name%TYPE;V_LastNamestudents.last_name%TYPE;CURSORc_HistoryStudentsISSELECTid,first_name,last_namefromstudentsWHEREmajor=‘History’;BEGINOpenc_HistoryStudents