版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 游標(biāo),Oracle編程中,可以使用函數(shù)、存儲(chǔ)過(guò)程等,這很大程度上接近于編程語(yǔ)言。Oracle的本質(zhì)還是作為一個(gè)數(shù)據(jù)庫(kù)存在的,因此,Oracle也必須提方便地訪問(wèn)數(shù)據(jù)的方法。這正是游標(biāo)概念的本質(zhì)允許用戶針對(duì)某個(gè)結(jié)果集進(jìn)行逐行訪問(wèn)。本章重點(diǎn)介紹游標(biāo)的概念,主要內(nèi)容包括: 聲明和使用顯式游標(biāo); 使用隱式游標(biāo); 使用動(dòng)態(tài)游標(biāo)。,9.1 游標(biāo)簡(jiǎn)介,游標(biāo)類似于編程語(yǔ)言中的指針,游標(biāo)可以進(jìn)行位置的移動(dòng),以循環(huán)訪問(wèn)結(jié)果集中每條記錄。通過(guò)游標(biāo)可以方便的訪問(wèn)當(dāng)前記錄。 游標(biāo)分兩類:顯式游標(biāo)和隱式游標(biāo)。顯式游標(biāo)可以被用戶顯式創(chuàng)建、打開(kāi)、訪問(wèn)、關(guān)閉,即用戶可以控制游標(biāo)的整個(gè)生命周期。而隱式游標(biāo)無(wú)需用戶的全程控
2、制,即可進(jìn)行訪問(wèn)。,9.2 顯式游標(biāo),顯式游標(biāo)在使用時(shí),應(yīng)該遵循聲明、打開(kāi)、訪問(wèn)、關(guān)閉的步驟。本節(jié)將通過(guò)幾個(gè)范例講解如何創(chuàng)建和使用游標(biāo),9.2.1 聲明游標(biāo),如同聲明變量,聲明游標(biāo)也應(yīng)該使用declare命令。游標(biāo)的內(nèi)容一般利用SQL查詢語(yǔ)句來(lái)定義。因?yàn)橛螛?biāo)的本質(zhì)就是用來(lái)處理結(jié)果集中的每條記錄。 declare cursor cu_student_name is select student_name from students; student_id number; -(1) student_name students.student_name%type; - (2) student stu
3、dents%rowtype; -(3) declare cursor cu_student(minAge in number, maxAge in number) is select * from students; where student_age= minAge and student_age=maxAge student students%rowtype;,9.2.2 使用游標(biāo),游標(biāo)的使用主要有三個(gè)步驟:打開(kāi)游標(biāo)、通過(guò)游標(biāo)獲取數(shù)據(jù)和關(guān)閉游標(biāo)。其中尤其需要注意的是關(guān)閉游標(biāo)。當(dāng)使用完游標(biāo)之后,應(yīng)該立即關(guān)閉,否則將會(huì)占用數(shù)據(jù)庫(kù)資源,增加數(shù)據(jù)庫(kù)負(fù)擔(dān)。本小節(jié)將通過(guò)范例來(lái)講述如何使用游標(biāo)。 dec
4、lare cursor cu_student(minAge in number, maxAge in number) is select * from students where student_age=minAge and student_age=maxAge; student students%rowtype; begin open cu_student(19,20); fetch cu_student into student; while cu_student%found loop dbms_output.put_line(student.student_name | : | stu
5、dent.student_age | 歲); fetch cu_student into student; end loop; close cu_student; end;,9.3 隱式游標(biāo),隱式游標(biāo)是相對(duì)于聲明游標(biāo)變量的顯式游標(biāo)而言的。顯式游標(biāo)通常使用declare命令來(lái)聲明游標(biāo);而隱式游標(biāo)則無(wú)需declare命令即可直接使用。隱式游標(biāo)不能直接被用戶控制和使用即不能執(zhí)行打開(kāi)(open),獲取游標(biāo)數(shù)據(jù)(fetch)、關(guān)閉(close)等。隱式游標(biāo)有兩種:使用Oracle預(yù)定義的名為SQL的隱式游標(biāo)和使用cursor for loop來(lái)進(jìn)行循環(huán)的隱式游標(biāo)。,9.3.1 sql隱式游標(biāo),Oracl
6、e為每個(gè)PL/SQL的會(huì)話都定義了一個(gè)名為sql的游標(biāo)變量??梢栽赑L/SQL Developer中直接調(diào)用該變量。 begin if sql%rowcount0 then dbms_output.put_line(sql游標(biāo)變量的rowcount屬性大于0); end if; end; declare student students%rowtype; begin update students set student_age = student_age -1 ; - fetch sql into student; dbms_output.put_line(共更新了 | sql%rowcou
7、nt | 條記錄); end;,9.3.2 cursor for游標(biāo),sql游標(biāo)可以應(yīng)用于更新及刪除數(shù)據(jù)表中的數(shù)據(jù),為了能夠處理select語(yǔ)句獲得的記錄集合,Oracle提供了另外一種隱式游標(biāo)cursor for游標(biāo)。利用該游標(biāo),用戶可以像使用普通循環(huán)語(yǔ)句一樣來(lái)循環(huán)處理SELECT語(yǔ)句所獲得的每一條記錄。 begin for student in (select * from students) loop dbms_output.put_line(student.student_id | : | student.student_name | : | student.student_age |
8、 歲); end loop; end;,9.3.3 隱式游標(biāo)和顯式游標(biāo),隱式游標(biāo)和顯式游標(biāo)都可以實(shí)現(xiàn)對(duì)結(jié)果集的操作,但是,相比之下,隱式游標(biāo)不需要用戶控制游標(biāo)的聲明、打開(kāi)、獲取和關(guān)閉,因此用戶可以利用更少的代碼實(shí)現(xiàn)同樣的功能。而且,隱式游標(biāo)的執(zhí)行速度更快,在對(duì)游標(biāo)的顯式控制要求不高時(shí),應(yīng)盡量選擇隱式游標(biāo)。,9.4 游標(biāo)屬性,游標(biāo)屬性反映了游標(biāo)的當(dāng)前狀態(tài),游標(biāo)屬性對(duì)于PL/SQL編程有著極為重要的作用。例如邏輯判斷等,都可以使用游標(biāo)屬性。本節(jié)將講述4個(gè)常用的游標(biāo)屬性. found屬性用于標(biāo)識(shí)當(dāng)前游標(biāo)從結(jié)果中獲取記錄時(shí),是否成功找到了記錄。 not found屬性是found屬性的對(duì)立面。 row
9、count屬性用于返回當(dāng)前時(shí)刻已經(jīng)獲得了多少條記錄。 isopen屬性用于判斷游標(biāo)是否處于打開(kāi)狀態(tài),如果游標(biāo)打開(kāi),則返回true,否則,將返回false。 【范例9-14】,9.5 動(dòng)態(tài)游標(biāo),無(wú)論顯式游標(biāo)還是隱式游標(biāo),都具有一個(gè)特點(diǎn),即游標(biāo)在打開(kāi)時(shí),其定義已經(jīng)確定。在整個(gè)程序的運(yùn)行過(guò)程中,游標(biāo)定義不能進(jìn)行更改。因此顯式游標(biāo)和隱式游標(biāo)被稱為靜態(tài)游標(biāo)。為了增加游標(biāo)的靈活性,Oracle提供了另外一種游標(biāo)動(dòng)態(tài)游標(biāo),即其定義在游標(biāo)聲明時(shí)沒(méi)有設(shè)定,在打開(kāi)時(shí),可以進(jìn)行動(dòng)態(tài)修改。 動(dòng)態(tài)游標(biāo)又分為兩類:強(qiáng)類型動(dòng)態(tài)游標(biāo)和弱類型動(dòng)態(tài)游標(biāo)。,9.5.1 強(qiáng)類型動(dòng)態(tài)游標(biāo),強(qiáng)類型動(dòng)態(tài)游標(biāo)是指,當(dāng)游標(biāo)聲明時(shí),雖未設(shè)定其查
10、詢定義,但是已經(jīng)指定了游標(biāo)的返回類型。游標(biāo)的返回類型,可以是Oracle內(nèi)置類型,也可以是自定義類型。 聲明一個(gè)強(qiáng)類型游標(biāo)首先自定義一個(gè)ref cursor的游標(biāo)類型,然后利用該自定義類型,聲明一個(gè)游標(biāo)變量。例如,現(xiàn)需一個(gè)打印學(xué)生信息的存儲(chǔ)過(guò)程。用戶可以向該存儲(chǔ)過(guò)程傳遞一個(gè)年齡參數(shù),該參數(shù)決定了打印哪些學(xué)生的信息。如果所傳入的年齡參數(shù)小于等于0,則打印所有學(xué)生的信息;如果傳入的參數(shù)大于0,則打印年齡與參數(shù)相同的學(xué)生的信息。 【范例9-15】,9.5.2 弱類型動(dòng)態(tài)游標(biāo),眾所周知,編程語(yǔ)言有強(qiáng)類型和弱類型之分,例如,VB、JavaScript為弱類型,在JavaScript中使用var關(guān)鍵字即可
11、聲明一個(gè)變量,該變量既可以存儲(chǔ)字符串也可以存儲(chǔ)數(shù)字;而Java、C等屬于強(qiáng)類型語(yǔ)句,變量類型在聲明時(shí)確定,而且一旦確定將不能改變。弱類型動(dòng)態(tài)游標(biāo)的概念與此類似,在聲明游標(biāo)時(shí)不使用return關(guān)鍵字指定游標(biāo)的返回類型,那么在以后的程序中,可以對(duì)其使用不同的返回類型。 【范例9-16】,9.5.3 比較兩種動(dòng)態(tài)游標(biāo),通過(guò)以上范例可知,強(qiáng)類型動(dòng)態(tài)游標(biāo)在使用時(shí),必須聲明其類型,在以后的使用過(guò)程中,雖然游標(biāo)的定義可以修改,但是返回值類型是一定的。而弱類型則無(wú)需聲明返回值類型,但在使用過(guò)程中,必須保證每次用于獲取記錄的類型都能夠正確接收來(lái)自游標(biāo)的數(shù)據(jù),因此,這也存在著一定的風(fēng)險(xiǎn)。應(yīng)盡量避免使用弱類型游標(biāo)。
12、,9.6 本章實(shí)例,相對(duì)于顯式游標(biāo),隱式游標(biāo)往往被開(kāi)發(fā)者忽略。而cursor for游標(biāo)使用簡(jiǎn)單、方便,因此,更值得關(guān)注。 set serverout on; begin for student in (select * from students where student_age=18 order by student_age desc) loop dbms_output.put_line(student.student_name | : | student.student_age | 歲); end loop; end;,9.7 本章小結(jié),本章講述了Oracle中各種游標(biāo)的使用。其中顯式游標(biāo)最符合用戶的思維習(xí)慣聲明游標(biāo)、打開(kāi)游標(biāo)、操作游標(biāo)、關(guān)閉游標(biāo)。尤其需要注意的是,在使用游標(biāo)結(jié)束之后,一定要執(zhí)行關(guān)閉操作。而隱式游標(biāo)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年床上用品品牌代理合同
- 2024醫(yī)院藥品零售許可合同
- 2024年建筑合同糾紛預(yù)防及處理辦法
- 2024年度IT企業(yè)軟件許可使用合同
- 2024年度搬廠工程機(jī)械設(shè)備租賃合同
- 2024年度委托加工合同:甲乙雙方在二零二四年就某產(chǎn)品委托加工的詳細(xì)條款
- 2024年度量子科技實(shí)驗(yàn)室建設(shè)安裝工程分包合同
- 2024年度智能停車安防監(jiān)控系統(tǒng)安裝合同
- 2024展廳裝飾裝修合同范文
- 2024年商標(biāo)許可使用合同商標(biāo)范圍
- 小記者第一課我是一名小記者
- 團(tuán)結(jié)友愛(ài)和睦相處主題班會(huì)
- 2024年采購(gòu)部年度工作總結(jié)
- 2024年江蘇省中等職業(yè)學(xué)校學(xué)生學(xué)業(yè)水平考試機(jī)械CAD繪圖評(píng)分表
- 期中 (試題) -2024-2025學(xué)年外研版(三起)英語(yǔ)六年級(jí)上冊(cè)
- 中小學(xué)教師職業(yè)道德規(guī)范(2023年修訂)全文1500字
- 2024年車路云一體化系統(tǒng)建設(shè)與應(yīng)用指南報(bào)告
- 2024中國(guó)移動(dòng)重慶公司社會(huì)招聘138人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 二十屆三中全會(huì)精神知識(shí)競(jìng)賽試題及答案
- (完整版)初中道德與法治課程標(biāo)準(zhǔn)
- 2024年福建省托育服務(wù)職業(yè)技能競(jìng)賽理論考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論