資源描述:
《oracle 存儲(chǔ)過(guò)程及游標(biāo)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、Oracle的存儲(chǔ)過(guò)程及游標(biāo)Oracle中的存儲(chǔ)過(guò)程和游標(biāo):selectmyFunc(參數(shù)1,參數(shù)2..)todual;--可以執(zhí)行一些業(yè)務(wù)邏輯一:Oracle中的函數(shù)與存儲(chǔ)過(guò)程的區(qū)別:A:函數(shù)必須有返回值,而過(guò)程沒(méi)有.B:函數(shù)可以單獨(dú)執(zhí)行.而過(guò)程必須通過(guò)execute執(zhí)行.C:函數(shù)可以嵌入到SQL語(yǔ)句中執(zhí)行.而過(guò)程不行.其實(shí)我們可以將比較復(fù)雜的查詢(xún)寫(xiě)成函數(shù).然后到存儲(chǔ)過(guò)程中去調(diào)用這些函數(shù).二:如何創(chuàng)建存儲(chǔ)過(guò)程:A:格式createorreplaceprocedure[(參數(shù)名參數(shù)類(lèi)型以及描述,....)]---注意,沒(méi)有
2、返回值is[變量聲明]begin[過(guò)程處理];----------null;exceptionwhen異常名thenend;注意:參數(shù)中默認(rèn)是按值傳遞.是in方式.也可以是out和inout方式.這些特點(diǎn)和函數(shù)一樣.B:舉例1:createorreplaceproceduremyPro----createorreplaceprocmyPro出錯(cuò)不能簡(jiǎn)寫(xiě)(ainint:=0,binint:=0)iscint:=0;beginc:=a+b;dbms_output.put_line('Cisvalue'
3、
4、c);end;執(zhí)行:executemyPro(10,2
5、0);---在SqlServer中.執(zhí)行存儲(chǔ)過(guò)程是不需要括弧的.注意分號(hào)不要調(diào)了.execmyPro(10,20);--可以簡(jiǎn)寫(xiě)C:舉例2:如果在一個(gè)函數(shù)里面包含Select語(yǔ)句的話(huà),那么該Select語(yǔ)句必須有into,過(guò)程同樣也需要.createorreplaceproceduremyPro1(aint:=0,bint:=0)iscint:=0;beginselectempno+a+bintocfromempwhereename='FORD';dbms_output.put_line('Cisvalues'
6、
7、c);end;執(zhí)行:executemyP
8、ro1(10,20)D:假如在一個(gè)過(guò)程里面要返回一個(gè)結(jié)果集,怎么辦?大家注意.就必須要用到游標(biāo)了!用游標(biāo)來(lái)處理這個(gè)結(jié)果集.createorreplaceprocedureTest(varEmpNameemp.ename%type)isbegin------會(huì)報(bào)錯(cuò).錯(cuò)誤原因沒(méi)有into子句.select*fromempwhereenamelike'%'
9、
10、varEmpName
11、
12、'%';end;這個(gè)程序我們無(wú)法用into,因?yàn)樵贠racle里面沒(méi)有一個(gè)類(lèi)型去接受一個(gè)結(jié)果集.這個(gè)時(shí)候我們可以聲明游標(biāo)對(duì)象去接受他.PL/SQL游標(biāo):A:分類(lèi):1:隱式游標(biāo):非用
13、戶(hù)明確聲明而產(chǎn)生的游標(biāo).你根本看不到cursor這個(gè)關(guān)鍵字.2:顯示游標(biāo):用戶(hù)明確通過(guò)cursor關(guān)鍵字來(lái)聲明的游標(biāo).B:什么是隱式游標(biāo):1:什么時(shí)候產(chǎn)生:會(huì)在執(zhí)行任何合法的SQL語(yǔ)句(DML---INSERTUPDATEDELETEDQL-----SELECT)中產(chǎn)生.他不一定存放數(shù)據(jù).也有可能存放記錄集所影響的行數(shù).如果執(zhí)行SELECT語(yǔ)句,這個(gè)時(shí)候游標(biāo)會(huì)存放數(shù)據(jù).如果執(zhí)行INSERTUPDATEDELETE會(huì)存放記錄影響的行數(shù).C:隱式游標(biāo)叫什么名字:名字叫sql關(guān)于sql的游標(biāo)變量到底有哪些呢?作用:返回最近一次執(zhí)行SQL語(yǔ)句所涉及的游標(biāo)相關(guān)信息
14、.因?yàn)槊繄?zhí)行一次SQL語(yǔ)句,都會(huì)產(chǎn)生一個(gè)隱式游標(biāo).那么當(dāng)前執(zhí)行的SQL語(yǔ)句就是當(dāng)前的隱式游標(biāo).sql%foundsql%notfoundsql%rowcountsql%isopenD:關(guān)于隱式游標(biāo)的例子:createtable學(xué)生基本信息表(StuIDint,StuNamevarchar2(20))altertable學(xué)生基本信息表addconstraintPK_STUIDprimarykey(StuID)declarenumint:=0;beginnum:=#deletefrom學(xué)生基本信息表whereStuID=num;ifsql%notfo
15、undthendbms_output.put_line('該行數(shù)據(jù)沒(méi)有發(fā)現(xiàn)');elsedbms_output.put_line('數(shù)據(jù)被發(fā)現(xiàn)并刪除,影響的行數(shù)為:'
16、
17、sql%rowcount);endif;end;E:關(guān)于顯示游標(biāo)的例子:1:如何定義顯示游標(biāo)declarecursoris[select語(yǔ)句];declarecursormycurisselectempno,ename,jobfromscott.emp;2:如何打開(kāi)游標(biāo):open;openmycur;3:如何通過(guò)游標(biāo)來(lái)讀取數(shù)據(jù)fetch
18、into4:如何關(guān)閉游標(biāo)