oracle存儲過程函數(shù)和程序包課件_第1頁
oracle存儲過程函數(shù)和程序包課件_第2頁
oracle存儲過程函數(shù)和程序包課件_第3頁
oracle存儲過程函數(shù)和程序包課件_第4頁
oracle存儲過程函數(shù)和程序包課件_第5頁
已閱讀5頁,還剩91頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

19十二月2022oracle存儲過程函數(shù)和程序包12十二月2022oracle存儲過程函數(shù)和程序包1回顧游標(biāo)就是指向上下文區(qū)的句柄或指針。游標(biāo)有兩種類型:顯式游標(biāo)、隱式游標(biāo)。四個游標(biāo)屬性:SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN顯式游標(biāo)的使用步驟:4個記錄變量和%ROWTYPE帶參數(shù)的游標(biāo)游標(biāo)FOR循環(huán)(循環(huán)游標(biāo))游標(biāo)中的更新和刪除REF游標(biāo)oracle存儲過程函數(shù)和程序包回顧游標(biāo)就是指向上下文區(qū)的句柄或指針。oracle存儲過程函2教學(xué)目標(biāo)掌握過程的用法掌握函數(shù)的用法理解過程與函數(shù)的相同點和不同點理解程序包的概念并能熟練應(yīng)用oracle存儲過程函數(shù)和程序包教學(xué)目標(biāo)掌握過程的用法oracle存儲過程函數(shù)和程序包3工作任務(wù)

用無參過程實現(xiàn)“HelloWorld!”程序用帶輸入?yún)?shù)的過程向表中插入記錄用帶輸出參數(shù)的過程查詢表中的記錄數(shù)使用帶輸入輸出參數(shù)的過程查詢記錄是否存在使用函數(shù)查詢部門信息使用程序包封裝過程和函數(shù)oracle存儲過程函數(shù)和程序包工作任務(wù)用無參過程實現(xiàn)“HelloWorld!”程序or4相關(guān)實踐知識從開始菜單中打開SQL*Plus工具,以SCOTT用戶的身份登錄到數(shù)據(jù)庫

oracle存儲過程函數(shù)和程序包相關(guān)實踐知識從開始菜單中打開SQL*Plus工具,以SCOT5不帶參數(shù)的過程2-1輸入以下代碼,創(chuàng)建一個最簡單的過程功能:顯示”HelloWorld!”CREATEORREPLACEPROCEDUREsp_helloWorldASBEGIN DBMS_OUTPUT.PUT_LINE('HelloWorld!');ENDsp_helloWorld;oracle存儲過程函數(shù)和程序包不帶參數(shù)的過程2-1輸入以下代碼,創(chuàng)建一個最簡單的過程CR6不帶參數(shù)的過程2-2執(zhí)行過程EXECUTEsp_helloWorld;執(zhí)行結(jié)果:刪除過程DROPPROCEDUREsp_helloWorld;oracle存儲過程函數(shù)和程序包不帶參數(shù)的過程2-2執(zhí)行過程oracle存儲過程函數(shù)和程序包7帶輸入?yún)?shù)的過程3-1實現(xiàn)的功能:向表dept中插入一條記錄創(chuàng)建帶輸入?yún)?shù)的過程,代碼為:oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-1實現(xiàn)的功能:向表dept中插入一條記錄8帶輸入?yún)?shù)的過程3-2CREATEORREPLACEPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('添加失敗!原因為:'||SQLERRM);ROLLBACK;ENDsp_dept_insert;oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-2CREATEORREPLACEP9帶輸入?yún)?shù)的過程3-3分別輸入兩組數(shù)據(jù)來執(zhí)行過程,結(jié)果如下:oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-3分別輸入兩組數(shù)據(jù)來執(zhí)行過程,結(jié)果如下10帶輸出參數(shù)的過程3-1實現(xiàn)功能:通過輸出參數(shù)count來得到dept表中的記錄數(shù)創(chuàng)建帶輸出參數(shù)的過程CREATEORREPLACEPROCEDUREsp_getcount(o_countOUTNUMBER)ASBEGIN SELECTCOUNT(*)INTOo_countFROMdept;ENDsp_getcount;oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-1實現(xiàn)功能:通過輸出參數(shù)count來得到11帶輸出參數(shù)的過程3-2編寫一段匿名的PL/SQL塊來執(zhí)行過程DECLARE cntNUMBER;BEGIN sp_getcount(cnt); DBMS_OUTPUT.PUT_LINE('dept表中的記錄數(shù)為:'||cnt);END;oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-2編寫一段匿名的PL/SQL塊來執(zhí)行過程12帶輸出參數(shù)的過程3-3輸出結(jié)果:oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-3輸出結(jié)果:oracle存儲過程函數(shù)和程13帶INOUT參數(shù)的過程2-1實現(xiàn)功能:查詢某個部門名稱在表dept中是否已經(jīng)存在創(chuàng)建帶INOUT參數(shù)的過程,代碼為:CREATEORREPLACEPROCEDUREsp_dept_dname_exist(io_valueINOUTVARCHAR2)ISl_countNUMBER;BEGINSELECTCOUNT(*)INTOl_countFROMdeptWHEREdname=io_value;IF(l_count>0)THENio_value:='存在';ELSEio_value:='不存在';ENDIF;ENDsp_dept_dname_exist;oracle存儲過程函數(shù)和程序包帶INOUT參數(shù)的過程2-1實現(xiàn)功能:查詢某個部門名稱在表14帶INOUT參數(shù)的過程2-2執(zhí)行過程:輸出結(jié)果:部門名稱ACCOUNTING存在!DECLAREl_iotestvarchar2(20):='ACCOUNTING';BEGINsp_dept_dname_exist(l_iotest);DBMS_OUTPUT.PUT_LINE('部門名稱ACCOUNTING'||l_iotest||'!');END;oracle存儲過程函數(shù)和程序包帶INOUT參數(shù)的過程2-2執(zhí)行過程:DECLAREora15函數(shù)4-1實現(xiàn)功能:按部門編號查詢出表dept中的部門名稱創(chuàng)建一個函數(shù),代碼為:oracle存儲過程函數(shù)和程序包函數(shù)4-1實現(xiàn)功能:oracle存儲過程函數(shù)和程序包16函數(shù)4-2CREATEORREPLACEFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN'錯誤!該編號的部門不存在!';ENDf_dept_getname_byno;oracle存儲過程函數(shù)和程序包函數(shù)4-2CREATEORREPLACEFUNCTIO17函數(shù)4-3函數(shù)的調(diào)用及其輸出結(jié)果:oracle存儲過程函數(shù)和程序包函數(shù)4-3函數(shù)的調(diào)用及其輸出結(jié)果:oracle存儲過程函數(shù)18函數(shù)4-4刪除函數(shù)DROPFUNCTIONf_dept_getname_byno

oracle存儲過程函數(shù)和程序包函數(shù)4-4oracle存儲過程函數(shù)和程序包19過程與函數(shù)小結(jié)2-1共同點:兩者的實質(zhì)都是已命名的PL/SQL程序塊,即子程序,它們是子程序的兩種類型,存儲在數(shù)據(jù)庫中,可以從任何數(shù)據(jù)庫客戶端和前臺應(yīng)用程序中調(diào)用它們。oracle存儲過程函數(shù)和程序包過程與函數(shù)小結(jié)2-1oracle存儲過程函數(shù)和程序包20過程與函數(shù)小結(jié)2-2不同點:過程函數(shù)參數(shù)模式可以是IN、OUT或INOUT參數(shù)模式只能是IN模式在語法規(guī)范中不包含RETURN子句在語法規(guī)范中必須包含RETURN子句在可執(zhí)行語句部分可以有RETURN語句,但其后不能加任何表達式在可執(zhí)行語句部分至少應(yīng)該包含一條RETURNexpression語句可以用EXECUTE語句來執(zhí)行不能用EXECUTE語句來執(zhí)行oracle存儲過程函數(shù)和程序包過程與函數(shù)小結(jié)2-2不同點:過程函數(shù)參數(shù)模式可以是IN、O21程序包5-1利用程序包封裝過程sp_dept_insert和函數(shù)f_dept_getname_byno程序包規(guī)范部分的代碼:CREATEORREPLACEPACKAGEpkg_deptAS PROCEDUREsp_dept_insert (i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2); FUNCTIONf_dept_getname_byno(i_deptnoNUMBER) RETURNVARCHAR2;ENDpkg_dept;oracle存儲過程函數(shù)和程序包程序包5-1利用程序包封裝過程sp_dept_insert和22程序包5-2程序包主體部分的代碼CREATEORREPLACEPACKAGEBODYpkg_deptAS--過程sp_dept_insertPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('添加失敗!原因為:'||SQLERRM);ROLLBACK;ENDsp_dept_insert;oracle存儲過程函數(shù)和程序包程序包5-2程序包主體部分的代碼CREATEORREP23程序包5-3

--函數(shù)f_num_rangeFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN'錯誤!該編號的部門不存在!';ENDf_dept_getname_byno;ENDpkg_dept;

oracle存儲過程函數(shù)和程序包程序包5-3--函數(shù)f_num_rangeoracle24程序包5-4執(zhí)行程序包中的過程和函數(shù):oracle存儲過程函數(shù)和程序包程序包5-4執(zhí)行程序包中的過程和函數(shù):oracle存儲過程函25程序包5-5刪除程序包:只刪除程序包主體:DROPPACKAGEBODYpkg_dept;刪除整個程序包(規(guī)范+主體):DROPPACKAGEpkg_dept;oracle存儲過程函數(shù)和程序包程序包5-5刪除程序包:oracle存儲過程函數(shù)和程序包26小結(jié):程序包的優(yōu)點使用程序包的優(yōu)點:信息隱藏模塊化對多態(tài)的支持性能更佳oracle存儲過程函數(shù)和程序包小結(jié):程序包的優(yōu)點使用程序包的優(yōu)點:oracle存儲過程函數(shù)27過程返回結(jié)果集2-1在Oracle中的過程不能象SQLSERVER那樣直接返回結(jié)果集,而必須借助于REF游標(biāo)程序包規(guī)范中的代碼:CREATEORREPLACEPACKAGEpkg_deptAS

TYPEdeptcursorISREFCURSOR;PROCEDUREsp_dept_getall(dept_curOUTdeptcursor);ENDpkg_dept;oracle存儲過程函數(shù)和程序包過程返回結(jié)果集2-1在Oracle中的過程不能象SQLSE28過程返回結(jié)果集2-2程序包主體中的代碼:執(zhí)行過程:CREATEORREPLACEPACKAGEBODYpkg_deptASPROCEDUREsp_dept_getall(dept_curOUTdeptcursor)ISBEGIN

OPENdept_curFORSELECT*FROMdept;ENDsp_dept_getall;ENDpkg_dept;VARIABLEtest_curREFCURSOR;EXECUTEpkg_dept.sp_dept_getall(:test_cur);PRINTtest_cur;oracle存儲過程函數(shù)和程序包過程返回結(jié)果集2-2程序包主體中的代碼:CREATEOR29OEM中管理過程、函數(shù)、程序包請老師用瀏覽器打開OEM,演示在OEM中管理過程、函數(shù)、程序包oracle存儲過程函數(shù)和程序包OEM中管理過程、函數(shù)、程序包請老師用瀏覽器打開OEM,演示30總結(jié)過程和函數(shù)都是命名的PL/SQL程序塊,合稱子程序過程有三種參數(shù)模式:IN、OUT和INOUT過程用戶執(zhí)行特定的任務(wù),函數(shù)用于執(zhí)行任務(wù)并返回值過程與函數(shù)的相同點和不同點程序包是對過程、函數(shù)、變量、常量、游標(biāo)、異常及PL/SQL數(shù)據(jù)類型等的封裝程序包由兩部分組成,即包規(guī)范和包主體使用程序包的優(yōu)點oracle存儲過程函數(shù)和程序包總結(jié)過程和函數(shù)都是命名的PL/SQL程序塊,合稱子程序ora31過程的定義定義:過程是一組為了完成特定功能的、符合數(shù)據(jù)庫程序腳本規(guī)范的程序,經(jīng)編譯后存儲在數(shù)據(jù)庫中,然后由一個應(yīng)用程序或其他的PL/SQL程序調(diào)用。從根本上講,過程就是命名的PL/SQL程序塊。oracle存儲過程函數(shù)和程序包過程的定義定義:oracle存儲過程函數(shù)和程序包32創(chuàng)建過程的語法CREATE[ORREPLACE]PROCEDUREprocedure_name[(parameter_list)] {AS|IS} [local_declarations] BEGIN executable_statements [EXCEPTION exception_handlers]END[procedure_name];oracle存儲過程函數(shù)和程序包創(chuàng)建過程的語法oracle存儲過程函數(shù)和程序包33執(zhí)行過程在SQL提示符下:EXEC[UTE]procedure_name(parameters_list)在其它的過程、函數(shù)或匿名的PL/SQL塊中的可執(zhí)行語句部分執(zhí)行過程,直接寫過程的名稱(如有參數(shù)需帶上)即可oracle存儲過程函數(shù)和程序包執(zhí)行過程在SQL提示符下:oracle存儲過程函數(shù)和程序包34刪除過程刪除過程的語法:

DROPPROCEDUREprocedure_name;oracle存儲過程函數(shù)和程序包刪除過程刪除過程的語法:oracle存儲過程函數(shù)和程序包35過程的參數(shù)模式Oracle中過程的參數(shù)模式有三種:IN、OUT和INOUT,即輸入、輸出和輸入輸出定義參數(shù)的語法:parameter_name[IN|OUT|INOUT]DATATYPE[{:=|DEFAULT}expression]oracle存儲過程函數(shù)和程序包過程的參數(shù)模式Oracle中過程的參數(shù)模式有三種:IN、O36IN模式參數(shù)IN模式是輸入模式,可以傳遞輸入?yún)?shù)IN模式是默認(rèn)模式,如果未指定參數(shù)的模式,則該參數(shù)是IN模式的可以在參數(shù)列表中為IN參數(shù)賦予一個默認(rèn)值oracle存儲過程函數(shù)和程序包IN模式參數(shù)IN模式是輸入模式,可以傳遞輸入?yún)?shù)oracle37OUT模式參數(shù)OUT模式是輸出模式,可以傳遞輸出參數(shù)OUT模式的參數(shù),則必須明確指定,即OUT必須注明在返回到調(diào)用環(huán)境之前,應(yīng)該先給OUT模式的參數(shù)賦值不能為OUT模式的參數(shù)賦默認(rèn)值oracle存儲過程函數(shù)和程序包OUT模式參數(shù)OUT模式是輸出模式,可以傳遞輸出參數(shù)ora38INOUT模式參數(shù)INOUT模式是一種比較特殊的模式,它兼有IN模式和OUT模式的特點INOUT模式的參數(shù),則必須明確指定不能為INOUT模式的參數(shù)賦默認(rèn)值oracle存儲過程函數(shù)和程序包INOUT模式參數(shù)INOUT模式是一種比較特殊的模式,它39函數(shù)的定義定義函數(shù)的實質(zhì)也是數(shù)據(jù)庫中已命名的PL/SQL程序塊。它的主要特性是函數(shù)能且只能返回一個值。oracle存儲過程函數(shù)和程序包函數(shù)的定義定義oracle存儲過程函數(shù)和程序包40創(chuàng)建函數(shù)的語法CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter_list)]RETURNDATATYPE {AS|IS} [local_declarations] BEGIN executable_statements [EXCEPTION exception_handlers] END[function_name];oracle存儲過程函數(shù)和程序包創(chuàng)建函數(shù)的語法CREATE[ORREPLACE]FUN41函數(shù)定義的要點創(chuàng)建函數(shù)時通過RETURN子句來定義函數(shù)的返回類型在函數(shù)體的任何地方用戶都可以通過RETURNexpression語句從函數(shù)返回,但表達式的類型一定要與RETURN子句中定義的數(shù)據(jù)類型一致。函數(shù)的參數(shù)模式只能是IN模式的,而不能是OUT或INOUT模式的。oracle存儲過程函數(shù)和程序包函數(shù)定義的要點創(chuàng)建函數(shù)時通過RETURN子句來定義函數(shù)的返回42調(diào)用函數(shù)在SQL提示符下:SELECTfunction_namefromdual;在其它的過程、函數(shù)或匿名的PL/SQL塊中的可以用一個與函數(shù)的返回類型相同的變量來接收該函數(shù)不能用EXECUTE語句來調(diào)用函數(shù)oracle存儲過程函數(shù)和程序包調(diào)用函數(shù)在SQL提示符下:oracle存儲過程函數(shù)和程序包43刪除函數(shù)刪除函數(shù)的語法:DROPFUNCTIONfunction_name;oracle存儲過程函數(shù)和程序包刪除函數(shù)oracle存儲過程函數(shù)和程序包44程序包程序包是對過程、函數(shù)、變量、常量、游標(biāo)、異常及PL/SQL數(shù)據(jù)類型等的封裝,是一種數(shù)據(jù)庫對象。它由兩部分構(gòu)成:程序包規(guī)范程序包主體oracle存儲過程函數(shù)和程序包程序包程序包是對過程、函數(shù)、變量、常量、游標(biāo)、異常及PL/S45創(chuàng)建程序包規(guī)范的語法創(chuàng)建程序包規(guī)范的語法CREATE[ORREPLACE]PACKAGEpackage_nameIS|AS[publictypeanditemdeclarations][subprogramspecifications]END[package_name];oracle存儲過程函數(shù)和程序包創(chuàng)建程序包規(guī)范的語法創(chuàng)建程序包規(guī)范的語法oracle存儲過46創(chuàng)建程序包主體的語法創(chuàng)建程序包主體的語法CREATE[ORREPLACE]PACKAGEBODYpackage_nameIS|AS[initialization_statements][subprogrambodies]END[package_name];oracle存儲過程函數(shù)和程序包創(chuàng)建程序包主體的語法創(chuàng)建程序包主體的語法oracle存儲過程47程序包元素的引用公有項:在程序包規(guī)范中聲明的元素,可以從其它的應(yīng)用程序或PL/SQL塊用點分表示法引用私有項:在程序包主體中定義的元素,并沒有在程序包規(guī)范中出現(xiàn)過,只能在程序包主體內(nèi)被使用,不能在程序包之外被引用點分表示法,即“程序包名稱”+“.”+“元素名稱”

oracle存儲過程函數(shù)和程序包程序包元素的引用公有項:在程序包規(guī)范中聲明的元素,可以從其它4819十二月2022oracle存儲過程函數(shù)和程序包12十二月2022oracle存儲過程函數(shù)和程序包49回顧游標(biāo)就是指向上下文區(qū)的句柄或指針。游標(biāo)有兩種類型:顯式游標(biāo)、隱式游標(biāo)。四個游標(biāo)屬性:SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT、SQL%ISOPEN顯式游標(biāo)的使用步驟:4個記錄變量和%ROWTYPE帶參數(shù)的游標(biāo)游標(biāo)FOR循環(huán)(循環(huán)游標(biāo))游標(biāo)中的更新和刪除REF游標(biāo)oracle存儲過程函數(shù)和程序包回顧游標(biāo)就是指向上下文區(qū)的句柄或指針。oracle存儲過程函50教學(xué)目標(biāo)掌握過程的用法掌握函數(shù)的用法理解過程與函數(shù)的相同點和不同點理解程序包的概念并能熟練應(yīng)用oracle存儲過程函數(shù)和程序包教學(xué)目標(biāo)掌握過程的用法oracle存儲過程函數(shù)和程序包51工作任務(wù)

用無參過程實現(xiàn)“HelloWorld!”程序用帶輸入?yún)?shù)的過程向表中插入記錄用帶輸出參數(shù)的過程查詢表中的記錄數(shù)使用帶輸入輸出參數(shù)的過程查詢記錄是否存在使用函數(shù)查詢部門信息使用程序包封裝過程和函數(shù)oracle存儲過程函數(shù)和程序包工作任務(wù)用無參過程實現(xiàn)“HelloWorld!”程序or52相關(guān)實踐知識從開始菜單中打開SQL*Plus工具,以SCOTT用戶的身份登錄到數(shù)據(jù)庫

oracle存儲過程函數(shù)和程序包相關(guān)實踐知識從開始菜單中打開SQL*Plus工具,以SCOT53不帶參數(shù)的過程2-1輸入以下代碼,創(chuàng)建一個最簡單的過程功能:顯示”HelloWorld!”CREATEORREPLACEPROCEDUREsp_helloWorldASBEGIN DBMS_OUTPUT.PUT_LINE('HelloWorld!');ENDsp_helloWorld;oracle存儲過程函數(shù)和程序包不帶參數(shù)的過程2-1輸入以下代碼,創(chuàng)建一個最簡單的過程CR54不帶參數(shù)的過程2-2執(zhí)行過程EXECUTEsp_helloWorld;執(zhí)行結(jié)果:刪除過程DROPPROCEDUREsp_helloWorld;oracle存儲過程函數(shù)和程序包不帶參數(shù)的過程2-2執(zhí)行過程oracle存儲過程函數(shù)和程序包55帶輸入?yún)?shù)的過程3-1實現(xiàn)的功能:向表dept中插入一條記錄創(chuàng)建帶輸入?yún)?shù)的過程,代碼為:oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-1實現(xiàn)的功能:向表dept中插入一條記錄56帶輸入?yún)?shù)的過程3-2CREATEORREPLACEPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('添加失敗!原因為:'||SQLERRM);ROLLBACK;ENDsp_dept_insert;oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-2CREATEORREPLACEP57帶輸入?yún)?shù)的過程3-3分別輸入兩組數(shù)據(jù)來執(zhí)行過程,結(jié)果如下:oracle存儲過程函數(shù)和程序包帶輸入?yún)?shù)的過程3-3分別輸入兩組數(shù)據(jù)來執(zhí)行過程,結(jié)果如下58帶輸出參數(shù)的過程3-1實現(xiàn)功能:通過輸出參數(shù)count來得到dept表中的記錄數(shù)創(chuàng)建帶輸出參數(shù)的過程CREATEORREPLACEPROCEDUREsp_getcount(o_countOUTNUMBER)ASBEGIN SELECTCOUNT(*)INTOo_countFROMdept;ENDsp_getcount;oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-1實現(xiàn)功能:通過輸出參數(shù)count來得到59帶輸出參數(shù)的過程3-2編寫一段匿名的PL/SQL塊來執(zhí)行過程DECLARE cntNUMBER;BEGIN sp_getcount(cnt); DBMS_OUTPUT.PUT_LINE('dept表中的記錄數(shù)為:'||cnt);END;oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-2編寫一段匿名的PL/SQL塊來執(zhí)行過程60帶輸出參數(shù)的過程3-3輸出結(jié)果:oracle存儲過程函數(shù)和程序包帶輸出參數(shù)的過程3-3輸出結(jié)果:oracle存儲過程函數(shù)和程61帶INOUT參數(shù)的過程2-1實現(xiàn)功能:查詢某個部門名稱在表dept中是否已經(jīng)存在創(chuàng)建帶INOUT參數(shù)的過程,代碼為:CREATEORREPLACEPROCEDUREsp_dept_dname_exist(io_valueINOUTVARCHAR2)ISl_countNUMBER;BEGINSELECTCOUNT(*)INTOl_countFROMdeptWHEREdname=io_value;IF(l_count>0)THENio_value:='存在';ELSEio_value:='不存在';ENDIF;ENDsp_dept_dname_exist;oracle存儲過程函數(shù)和程序包帶INOUT參數(shù)的過程2-1實現(xiàn)功能:查詢某個部門名稱在表62帶INOUT參數(shù)的過程2-2執(zhí)行過程:輸出結(jié)果:部門名稱ACCOUNTING存在!DECLAREl_iotestvarchar2(20):='ACCOUNTING';BEGINsp_dept_dname_exist(l_iotest);DBMS_OUTPUT.PUT_LINE('部門名稱ACCOUNTING'||l_iotest||'!');END;oracle存儲過程函數(shù)和程序包帶INOUT參數(shù)的過程2-2執(zhí)行過程:DECLAREora63函數(shù)4-1實現(xiàn)功能:按部門編號查詢出表dept中的部門名稱創(chuàng)建一個函數(shù),代碼為:oracle存儲過程函數(shù)和程序包函數(shù)4-1實現(xiàn)功能:oracle存儲過程函數(shù)和程序包64函數(shù)4-2CREATEORREPLACEFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN'錯誤!該編號的部門不存在!';ENDf_dept_getname_byno;oracle存儲過程函數(shù)和程序包函數(shù)4-2CREATEORREPLACEFUNCTIO65函數(shù)4-3函數(shù)的調(diào)用及其輸出結(jié)果:oracle存儲過程函數(shù)和程序包函數(shù)4-3函數(shù)的調(diào)用及其輸出結(jié)果:oracle存儲過程函數(shù)66函數(shù)4-4刪除函數(shù)DROPFUNCTIONf_dept_getname_byno

oracle存儲過程函數(shù)和程序包函數(shù)4-4oracle存儲過程函數(shù)和程序包67過程與函數(shù)小結(jié)2-1共同點:兩者的實質(zhì)都是已命名的PL/SQL程序塊,即子程序,它們是子程序的兩種類型,存儲在數(shù)據(jù)庫中,可以從任何數(shù)據(jù)庫客戶端和前臺應(yīng)用程序中調(diào)用它們。oracle存儲過程函數(shù)和程序包過程與函數(shù)小結(jié)2-1oracle存儲過程函數(shù)和程序包68過程與函數(shù)小結(jié)2-2不同點:過程函數(shù)參數(shù)模式可以是IN、OUT或INOUT參數(shù)模式只能是IN模式在語法規(guī)范中不包含RETURN子句在語法規(guī)范中必須包含RETURN子句在可執(zhí)行語句部分可以有RETURN語句,但其后不能加任何表達式在可執(zhí)行語句部分至少應(yīng)該包含一條RETURNexpression語句可以用EXECUTE語句來執(zhí)行不能用EXECUTE語句來執(zhí)行oracle存儲過程函數(shù)和程序包過程與函數(shù)小結(jié)2-2不同點:過程函數(shù)參數(shù)模式可以是IN、O69程序包5-1利用程序包封裝過程sp_dept_insert和函數(shù)f_dept_getname_byno程序包規(guī)范部分的代碼:CREATEORREPLACEPACKAGEpkg_deptAS PROCEDUREsp_dept_insert (i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2); FUNCTIONf_dept_getname_byno(i_deptnoNUMBER) RETURNVARCHAR2;ENDpkg_dept;oracle存儲過程函數(shù)和程序包程序包5-1利用程序包封裝過程sp_dept_insert和70程序包5-2程序包主體部分的代碼CREATEORREPLACEPACKAGEBODYpkg_deptAS--過程sp_dept_insertPROCEDUREsp_dept_insert(i_deptnoNUMBER,i_dnameVARCHAR2,i_locVARCHAR2)ASBEGININSERTINTOdeptVALUES(i_deptno,i_dname,i_loc);COMMIT;EXCEPTIONWHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('添加失敗!原因為:'||SQLERRM);ROLLBACK;ENDsp_dept_insert;oracle存儲過程函數(shù)和程序包程序包5-2程序包主體部分的代碼CREATEORREP71程序包5-3

--函數(shù)f_num_rangeFUNCTIONf_dept_getname_byno(i_deptnoNUMBER)RETURNVARCHAR2ASl_dnameVARCHAR2(14);BEGINSELECTdnameINTOl_dnameFROMdeptWHEREdeptno=i_deptno;RETURNl_dname;EXCEPTIONWHENNO_DATA_FOUNDTHENRETURN'錯誤!該編號的部門不存在!';ENDf_dept_getname_byno;ENDpkg_dept;

oracle存儲過程函數(shù)和程序包程序包5-3--函數(shù)f_num_rangeoracle72程序包5-4執(zhí)行程序包中的過程和函數(shù):oracle存儲過程函數(shù)和程序包程序包5-4執(zhí)行程序包中的過程和函數(shù):oracle存儲過程函73程序包5-5刪除程序包:只刪除程序包主體:DROPPACKAGEBODYpkg_dept;刪除整個程序包(規(guī)范+主體):DROPPACKAGEpkg_dept;oracle存儲過程函數(shù)和程序包程序包5-5刪除程序包:oracle存儲過程函數(shù)和程序包74小結(jié):程序包的優(yōu)點使用程序包的優(yōu)點:信息隱藏模塊化對多態(tài)的支持性能更佳oracle存儲過程函數(shù)和程序包小結(jié):程序包的優(yōu)點使用程序包的優(yōu)點:oracle存儲過程函數(shù)75過程返回結(jié)果集2-1在Oracle中的過程不能象SQLSERVER那樣直接返回結(jié)果集,而必須借助于REF游標(biāo)程序包規(guī)范中的代碼:CREATEORREPLACEPACKAGEpkg_deptAS

TYPEdeptcursorISREFCURSOR;PROCEDUREsp_dept_getall(dept_curOUTdeptcursor);ENDpkg_dept;oracle存儲過程函數(shù)和程序包過程返回結(jié)果集2-1在Oracle中的過程不能象SQLSE76過程返回結(jié)果集2-2程序包主體中的代碼:執(zhí)行過程:CREATEORREPLACEPACKAGEBODYpkg_deptASPROCEDUREsp_dept_getall(dept_curOUTdeptcursor)ISBEGIN

OPENdept_curFORSELECT*FROMdept;ENDsp_dept_getall;ENDpkg_dept;VARIABLEtest_curREFCURSOR;EXECUTEpkg_dept.sp_dept_getall(:test_cur);PRINTtest_cur;oracle存儲過程函數(shù)和程序包過程返回結(jié)果集2-2程序包主體中的代碼:CREATEOR77OEM中管理過程、函數(shù)、程序包請老師用瀏覽器打開OEM,演示在OEM中管理過程、函數(shù)、程序包oracle存儲過程函數(shù)和程序包OEM中管理過程、函數(shù)、程序包請老師用瀏覽器打開OEM,演示78總結(jié)過程和函數(shù)都是命名的PL/SQL程序塊,合稱子程序過程有三種參數(shù)模式:IN、OUT和INOUT過程用戶執(zhí)行特定的任務(wù),函數(shù)用于執(zhí)行任務(wù)并返回值過程與函數(shù)的相同點和不同點程序包是對過程、函數(shù)、變量、常量、游標(biāo)、異常及PL/SQL數(shù)據(jù)類型等的封裝程序包由兩部分組成,即包規(guī)范和包主體使用程序包的優(yōu)點oracle存儲過程函數(shù)和程序包總結(jié)過程和函數(shù)都是命名的PL/SQL程序塊,合稱子程序ora79過程的定義定義:過程是一組為了完成特定功能的、符合數(shù)據(jù)庫程序腳本規(guī)范的程序,經(jīng)編譯后存儲在數(shù)據(jù)庫中,然后由一個應(yīng)用程序或其他的PL/SQL程序調(diào)用。從根本上講,過程就是命名的PL/SQL程序塊。oracle存儲過程函數(shù)和程序包過程的定義定義:oracle存儲過程函數(shù)和程序包80創(chuàng)建過程的語法CREATE[ORREPLACE]PROCEDUREprocedure_name[(parameter_list)] {AS|IS} [local_declarations] BEGIN executable_statements [EXCEPTION exception_handlers]END[procedure_name];oracle存儲過程函數(shù)和程序包創(chuàng)建過程的語法oracle存儲過程函數(shù)和程序包81執(zhí)行過程在SQL提示符下:EXEC[UTE]procedure_name(parameters_list)在其它的過程、函數(shù)或匿名的PL/SQL塊中的可執(zhí)行語句部分執(zhí)行過程,直接寫過程的名稱(如有參數(shù)需帶上)即可oracle存儲過程函數(shù)和程序包執(zhí)行過程在SQL提示符下:oracle存儲過程函數(shù)和程序包82刪除過程刪除過程的語法:

DROPPROCEDUREprocedure_name;oracle存儲過程函數(shù)和程序包刪除過程刪除過程的語法:oracle存儲過程函數(shù)和程序包83過程的參數(shù)模式Oracle中過程的參數(shù)模式有三種:IN、OUT和INOUT,即輸入、輸出和輸入輸出定義參數(shù)的語法:parameter_name[IN|OUT|INOUT]DATATYPE[{:=|DEFAULT}expression]oracle存儲過程函數(shù)和程序包過程的參數(shù)模式Oracle中過程的參數(shù)模式有三種:IN、O84IN模式參數(shù)IN模式是輸入模式,可以傳遞輸入?yún)?shù)IN模式是默認(rèn)模式,如果未指定參數(shù)的模式,則該參數(shù)是IN模式的可以在參數(shù)列表中為IN參數(shù)賦予一個默認(rèn)值oracle存儲過程函數(shù)和程序包IN模式參數(shù)IN模式是輸入模式,可以傳遞輸入?yún)?shù)oracle85OUT模式參數(shù)OUT模式是輸出模式,可以傳遞輸出參數(shù)OUT模式的參數(shù),則必須明確指定,即OUT必須注明在返回到調(diào)用環(huán)境之前,應(yīng)該先

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論