ORACLE程序包的創(chuàng)建與應(yīng)用_第1頁
ORACLE程序包的創(chuàng)建與應(yīng)用_第2頁
ORACLE程序包的創(chuàng)建與應(yīng)用_第3頁
ORACLE程序包的創(chuàng)建與應(yīng)用_第4頁
ORACLE程序包的創(chuàng)建與應(yīng)用_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、.ORACLE PL/SQL編程詳解之七:程序包的創(chuàng)建與應(yīng)用(聰明在于學(xué)習(xí),天才在于積累 ! )本篇主要內(nèi)容如下:第七章程序包的創(chuàng)建和應(yīng)用7.1 程序包簡介7.2 程序包的定義7.3 包的開發(fā)步驟7.4 包定義的說明7.5 子程序重載7.6 加密實(shí)用程序7.7 刪除包7.8 包的管理7.1 程序包簡介程序包 (PACKAGE ,簡稱包 )是一組相關(guān)過程、函數(shù) 、變量 、常量和游標(biāo)等PL/SQL 程序設(shè)計元素的組合 ,作為一個完整的單元存儲在數(shù)據(jù)庫中,用名稱來標(biāo)識包。它具有面向?qū)ο蟪绦蛟O(shè)計語言的特點(diǎn) ,是對這些PL/SQL程序設(shè)計元素的封裝。包類似于c# 和 JAVA 語言中的類,其中變量相當(dāng)于

2、類中的成員變量,過程和函數(shù)相當(dāng)于類方法。 把相關(guān)的模塊歸類成為包,可使開發(fā)人員利用面向?qū)ο蟮姆椒ㄟM(jìn)行存儲過程的開發(fā),從而提高系統(tǒng)性能。與高級語言中的類相同,包中的程序元素也分為 公用元素 和私用元素 兩種 ,這兩種元素的區(qū)別是他們允許訪問的程序范圍不同,即它們的作用域不同。公用元素不僅可以被包中的函數(shù)、.下載可編輯 .過程所調(diào)用 ,也可以被包外的PL/SQL 程序訪問 ,而私有元素只能被包內(nèi)的函數(shù)和過程序所訪問。當(dāng)然 ,對于不包含在程序包中的過程、函數(shù)是獨(dú)立存在的。一般是先編寫?yīng)毩⒌倪^程與函數(shù),待其較為完善或經(jīng)過充分驗(yàn)證無誤后,再按邏輯相關(guān)性組織為程序包。程序包的優(yōu)點(diǎn)簡化應(yīng)用程序設(shè)計:程序包的

3、說明部分和包體部分可以分別創(chuàng)建各編譯。主要體現(xiàn)在以下三個方面:1) 可以在設(shè)計一個應(yīng)用程序時,只創(chuàng)建各編譯程序包的說明部分,然后再編寫引用該程序包的 PL/SQL 塊 。2) 當(dāng)完成整個應(yīng)用程序的整體框架后,再回頭來定義包體部分。只要不改變包的說明部分,就可以單獨(dú)調(diào)試 、增加或替換包體的內(nèi)容,這不會影響其他的應(yīng)用程序。3) 更新包的說明后必須重新編譯引用包的應(yīng)用程序,但更新包體 ,則不需重新編譯引用包的應(yīng)用程序 ,以快速進(jìn)行應(yīng)用程序的原形開發(fā)。模塊化 :可將邏輯相關(guān)的PL/SQL 塊或元素等組織在一起,用名稱來唯一標(biāo)識程序包。把一個大的功能模塊劃分人適當(dāng)個數(shù)小的功能模塊,分別完成各自的功能。這

4、樣組織的程序包都易于編寫 ,易于理解更易于管理。信息隱藏 :因?yàn)榘械脑乜梢苑譃楣性睾退接性?。公有元素可被程序包?nèi)的過程、函數(shù)等的訪問 ,還可以被包外的PL/SQL 訪問 。 但對于私有元素只能被包內(nèi)的過程、函數(shù)等訪問 。 對于用戶 ,只需知道包的說明,不用了解包休的具體細(xì)節(jié)。效率高 :程序包在應(yīng)用程序第一次調(diào)用程序包中的某個元素時, ORACLE 將把整個程序包加載到內(nèi)存中 ,當(dāng)?shù)诙卧L問程序包中的元素時, ORACLE 將直接從內(nèi)在中讀取 ,而不.下載可編輯 .需要進(jìn)行磁盤I/O 操作而影響速度,同時位于內(nèi)在中的程序包可被同一會話期間的其它應(yīng)用程序共享 。 因此 ,程序包增加了重用

5、性并改善了多用戶、多應(yīng)用程序環(huán)境的效率。對程序包的優(yōu)點(diǎn)可總結(jié)如下:在PL/SQL程序設(shè)計中 ,使用包不僅可以使程序設(shè)計模塊化,對外隱藏包內(nèi)所使用的信息(通過使用私用變量), 而寫可以提高程序的執(zhí)行效率。因?yàn)椋?dāng)程序首次調(diào)用包內(nèi)函數(shù)或過程時, ORACLE 將整個包調(diào)入內(nèi)存,當(dāng)再次訪問包內(nèi)元素時,ORACLE 直接從內(nèi)存中讀取,而不需要進(jìn)行磁盤I/O 操作 ,從而使程序執(zhí)行效率得到提高。一個包由兩個分開的部分組成:包說明 ( PACKAGE): 包說明部分聲明包內(nèi)數(shù)據(jù)類型、變量 、常量 、游標(biāo) 、子程序和異常錯誤處理等元素 ,這些元素為包的公有元素。包主體 ( PACKAGE BODY ): 包

6、主體則是包定義部分的具體實(shí)現(xiàn),它定義了包定義部分所聲明的游標(biāo)和子程序,在包主體中還可以聲明包的私有元素。包說明和包主體分開編譯,并作為兩部分分開的對象存放在數(shù)據(jù)庫字典中,可查看數(shù)據(jù)字典user_source, all_source, dba_source,分別了解包說明與包主體的詳細(xì)信息。7.2 程序包的定義程序包的定義分為程序包說明定義和程序包主體定義兩部分組成 。程序包說明用于聲明包的公用組件,如變量 、常量、自定義數(shù)據(jù)類型、異常、過程、函數(shù)、游標(biāo)等 。 包說明中定義的公有組件不僅可以在包內(nèi)使用,還可以由包外其他過程、函數(shù) 。但需要說明與注意的是,我們?yōu)榱藢?shí)現(xiàn)信息的隱藏,建議不要將所有組件

7、都放在包說明處聲明,只應(yīng)把公共組件放在包聲明部分。包的名稱是唯一的,但對于兩個包中的公有組件的名稱可以相同,這種用 “包名 .公有組件名“加以區(qū)分 。.下載可編輯 .包體是包的具體實(shí)現(xiàn)細(xì)節(jié),其實(shí)現(xiàn)在包說明中聲明的所有公有過程、函數(shù) 、游標(biāo)等 。 當(dāng)然也可以在包體中聲明僅屬于自己的私有過程、函數(shù) 、游標(biāo)等 。 創(chuàng)建包體時 ,有以下幾點(diǎn)需要注意:包體只能在包說明被創(chuàng)建或編譯后才能進(jìn)行創(chuàng)建或編譯。在包體中實(shí)現(xiàn)的過程、函數(shù) 、游標(biāo)的名稱必須與包說明中的過程、函數(shù) 、游標(biāo)一致 ,包括名稱、參數(shù)的名稱以及參數(shù)的模式( IN 、OUT 、 IN OUT )。 并建設(shè)按包說明中的次序定義包體中具體的實(shí)現(xiàn)。在包

8、體中聲明的數(shù)據(jù)類型、變量 、常量都是私有的,只能在包體中使用而不能被印刷體外的應(yīng)用程序訪問與使用。在包體執(zhí)行部分,可對包說明 ,包體中聲明的公有或私有變量進(jìn)行初始化或其它設(shè)置。創(chuàng)建程序包說明語法格式:CREATE OR REPLACE PACKAGE package_nameAUTHIDCURRENT_USER | DEFINERIS | AS 公有數(shù)據(jù)類型定義 公有數(shù)據(jù)類型定義 公有游標(biāo)聲明 公有游標(biāo)聲明 公有變量 、常量聲明 公有變量 、常量聲明 公有函數(shù)聲明 公有函數(shù)聲明 公有過程聲明 公有過程聲明 END package_name;其中 : AUTHID CURRENT_USER和 A

9、UTHID DEFINER 選項(xiàng)說明應(yīng)用程序在調(diào)用函數(shù)時所使用的權(quán)限模式,它們與 CREATE FUNCTION 語句中invoker_right_clause子句的作用相同 。創(chuàng)建程序包主體語法格式:CREATE OR REPLACE PACKAGE BODY package_nameIS | AS 私有數(shù)據(jù)類型定義 私有數(shù)據(jù)類型定義 私有變量 、常量聲明 私有變量 、常量聲明 私有異常錯誤聲明 私有異常錯誤聲明 .下載可編輯 . 私有函數(shù)聲明和定義 私有函數(shù)聲明和定義 私有函過程聲明和定義 私有函過程聲明和定義 公有游標(biāo)定義 公有游標(biāo)定義 公有函數(shù)定義 公有函數(shù)定義 公有過程定義 公有過程

10、定義 BEGIN執(zhí)行部分 (初始化部分 )END package_name;其中:在包主體定義公有程序時,它們必須與包定義中所聲明子程序的格式完全一致。7.3 包的開發(fā)步驟與開發(fā)存儲過程類似,包的開發(fā)需要幾個步驟:1 將每個存儲過程調(diào)式正確;2 用文本編輯軟件將各個存儲過程和函數(shù)集成在一起;3 按照包的定義要求將集成的文本的前面加上包定義;4 按照包的定義要求將集成的文本的前面加上包主體;5 使用 SQLPLUS 或開發(fā)工具進(jìn)行調(diào)式 。7.4 包定義的說明例 1: 創(chuàng)建的包為DEMO_PKG,該包中包含一個記錄變量DEPTREC、兩個函數(shù)和一個過程。實(shí)現(xiàn)對 dept 表的增加 、刪除與查詢 。

11、CREATE OR REPLACE PACKAGE DEMO_PKGISDEPTREC DEPT%ROWTYPE;-Adddept.FUNCTIONadd_dept(dept_noNUMBER ,dept_nameVARCHAR2 ,locationVARCHAR2 )RETURN NUMBER ;.下載可編輯 .-deletedept.FUNCTIONdelete_dept(dept_noNUMBER )RETURN NUMBER ;-querydept.PROCEDURE query_dept(dept_noIN NUMBER );END DEMO_PKG;包主體的創(chuàng)建方法 ,它實(shí)現(xiàn)上面所

12、聲明的包定義,并在包主體中聲明一個私有變量flag 和一個私有函數(shù)check_dept ,由于在 add_dept 和 remove_dept等函數(shù)中需要調(diào)用 check_dpet 函數(shù),所以,在定義 check_dept函數(shù)之前首先對該函數(shù)進(jìn)行聲明,這種聲明方法稱作前向聲明。CREATE OR REPLACE PACKAGE BODY DEMO_PKGISFUNCTIONadd_dept(dept_noNUMBER ,dept_nameVARCHAR2 ,locationVARCHAR2)RETURN NUMBERISempno_remainingEXCEPTION; - 自定義異常PRAG

13、MAEXCEPTION_INIT(empno_remaining,- 1);/*-1 是違反唯一約束條件的錯誤代碼*/BEGININSERT INTOdeptVALUES(dept_no,dept_name,location);IF SQL%FOUNDTHENRETURN 1 ;END IF;EXCEPTIONWHENempno_remainingTHENRETURN 0 ;WHENOTHERS THENRETURN - 1;END add_dept;FUNCTIONdelete_dept(dept_noNUMBER )RETURN NUMBERISBEGIN.下載可編輯 .DELETE FR

14、OM deptWHERE deptno=dept_no;IF SQL%FOUNDTHENRETURN 1 ;ELSERETURN 0 ;END IF;EXCEPTIONWHENOTHERS THENRETURN - 1;END delete_dept;PROCEDURE query_dept(dept_noIN NUMBER )ISBEGINSELECT * INTODeptRecFROM deptWHERE deptno =dept_no;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE( '溫馨提示 :數(shù)據(jù)庫中沒有編碼為'

15、|dept_no |'的部門 ');WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE( '程序運(yùn)行錯誤 ,請使用游標(biāo)進(jìn)行操作!' );WHENOTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE |'-' |SQLERRM);END query_dept;BEGINNull ;END DEMO_PKG;對包內(nèi)共有元素的調(diào)用格式為:包名 .元素名稱調(diào)用 DEMO_PKG 包內(nèi)函數(shù)對 dept 表進(jìn)行插入 、查詢和刪除操作,并通過DEMO_PKG 包中的記錄變量DEPTREC顯示所查詢到的數(shù)

16、據(jù)庫信息:DECLAREVar NUMBER ;BEGINVar := DEMO_PKG.add_dept( 90 ,'HKLORB' , 'HAIKOU' );IF var=- 1 THENDBMS_OUTPUT.PUT_LINE(SQLCODE |'-' |SQLERRM);ELSIF var= 0 THENDBMS_OUTPUT.PUT_LINE( '溫馨提示 :該部門記錄已經(jīng)存在! ');ELSEDBMS_OUTPUT.PUT_LINE( '溫馨提示 :添加記錄成功 !');.下載可編輯 .DEMO_PKG

17、.query_dept(90);DBMS_OUTPUT.PUT_LINE(DEMO_PKG.DeptRec.deptno |'-' |DEMO_PKG.DeptRec.dname |'-' |DEMO_ PKG.DeptRec.loc);var :=DEMO_PKG.delete_dept( 90 );IF var=- 1 THENDBMS_OUTPUT.PUT_LINE(SQLCODE |'-' |SQLERRM);ELSIF var = 0 THENDBMS_OUTPUT.PUT_LINE( '溫馨提示 :該部門記錄不存在!'

18、);ELSEDBMS_OUTPUT.PUT_LINE( '溫馨提示 :刪除記錄成功 !');END IF;END IF;END;例 2: 創(chuàng)建包 EMP_PKG,讀取 emp 表中的數(shù)據(jù)- 創(chuàng)建包說明CREATE OR REPLACE PACKAGEEMP_PKGISTYPE emp_table_typeIS TABLE OF emp %ROWTYPEINDEXBY BINARY_INTEGER;PROCEDUREread_emp_table(p_emp_tableOUTemp_table_type);END EMP_PKG;- 創(chuàng)建包體CREATE OR REPLACE PA

19、CKAGEBODYEMP_PKGISPROCEDUREread_emp_table(p_emp_tableOUTemp_table_type)ISI BINARY_INTEGER:=0 ;BEGINFOR emp_recordIN( SELECT * FROMemp) LOOPP_emp_table(i):= emp_record;I:=I+1;END LOOP;END read_emp_table;END EMP_PKG;- 執(zhí)行DECLAREE_tableEMP_PKG.emp_table_type;BEGINEMP_PKG.read_emp_table(e_table);FOR I IN

20、e_table.FIRST .e_table.LASTLOOP.下載可編輯 .DBMS_OUTPUT.PUT_LINE(e_table(i).empno| ' '| e_table(i).ename);END LOOP;END ;例 3: 創(chuàng)建包 MANAGE_EMP_PKG ,對員工進(jìn)行管理(新增員工 、新增部門 、刪除指定員工、刪除指定部門 、增加指定員工的工資與獎金):- 創(chuàng)建序列從 100 開始 ,依次增加 1 CREATE SEQUENCE empseq START WITH 100 INCREMENT BY 1ORDER NOCYCLE;- 創(chuàng)建序列從 100 開始

21、 ,依次增加 10 CREATE SEQUENCE deptseq START WITH 100INCREMENT BY 10 ORDER NOCYCLE;- *- 創(chuàng)建包說明- 包 名: MANAGE_EMP_PKG- 功能描述 :對員工進(jìn)行管理 (新增員工 ,新增部門- ,刪除員工 ,刪除部門 ,增加工資與獎金等 )- 創(chuàng)建人員 :胡勇- 創(chuàng)建日期 : 2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: - *CREATE OR REPLACE PACKAGEMANAGE_EMP_PKGAS- 增加一名員工FUNCTIONhire_

22、emp(enameVARCHAR2 , jobVARCHAR2, mgr NUMBER , sal NUMBER, comm NUMBER , deptno NUMBER )RETURN NUMBER ;- 新增一個部門FUNCTIONadd_dept(dnameVARCHAR2 , locVARCHAR2 )RETURNNUMBER ;- 刪除指定員工.下載可編輯 .PROCEDUREremove_emp(empnoNUMBER );- 刪除指定部門PROCEDUREremove_dept(deptnoNUMBER );- 增加指定員工的工資PROCEDUREincrease_sal(emp

23、noNUMBER , sal_incrNUMBER );- 增加指定員工的獎金PROCEDUREincrease_comm(empnoNUMBER , comm_incrNUMBER );END MANAGE_EMP_PKG; - 創(chuàng)建包說明結(jié)束- *- 創(chuàng)建包體- 包 名: MANAGE_EMP_PKG- 功能描述 :對員工進(jìn)行管理 (新增員工 ,新增部門- ,刪除員工 ,刪除部門 ,增加工資與獎金等 )- 創(chuàng)建人員 :胡勇- 創(chuàng)建日期 : 2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: - *CREATE OR REPLACE

24、PACKAGEBODYMANAGE_EMP_PKGAStotal_empsNUMBER ; - 員工數(shù)total_deptsNUMBER ; - 部門數(shù)no_salEXCEPTION;no_commEXCEPTION;- 增加一名員工FUNCTION hire_emp(ename VARCHAR2 , job VARCHAR2 , mgr NUMBER , sal NUMBER , comm NUMBER , deptno NUMBER )RETURNNUMBER- 返回新增加的員工編號ISnew_empnoNUMBER (4 );BEGINSELECT empseq.NEXTVALINTOn

25、ew_empnoFROMdual;SELECT COUNT (*) INTOtotal_empsFROMemp; - 當(dāng)前記錄總數(shù)INSERT INTOempVALUES (new_empno,ename,job,mgr,sysdate,sal, comm,deptno);total_emps:= total_emps+ 1 ;RETURN (new_empno);EXCEPTIONWHENOTHERS THENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END hire_emp;.下載可編輯 .- 新增一個部門FUNCTIONadd_de

26、pt(dnameVARCHAR2 , locVARCHAR2 )RETURNNUMBERISnew_deptnoNUMBER (4); - 部門編號BEGIN- 得到一個新的自增的員工編號SELECT deptseq.NEXTVALINTOnew_deptnoFROMdual;SELECT COUNT (*) INTOtotal_deptsFROMdept; - 當(dāng)前部門總數(shù)INSERT INTOdeptVALUES (new_deptno,dname,loc);total_depts:=total_depts;RETURN (new_deptno);EXCEPTIONWHENOTHERS T

27、HENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END add_dept;- 刪除指定員工PROCEDUREremove_emp(empnoNUMBER )ISno_resultEXCEPTION;- 自定義異常BEGINDELETE FROMempWHERE emp.empno= remove_emp.empno;IF SQL%NOTFOUNDTHENRAISE no_result;END IF;total_emps:= total_emps- 1; - 總的員工數(shù)減1EXCEPTIONWHENno_resultTHENDBMS_OUT

28、PUT.PUT_LINE(' 溫馨提示 :你需要的數(shù)據(jù)不存在!' );WHENOTHERS THENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END remove_emp;- 刪除指定部門PROCEDUREremove_dept(deptnoNUMBER )ISno_resultEXCEPTION;- 自定義異常exception_deptno_remainingEXCEPTION;- 自定義異常/*-2292是違反一致性約束的錯誤代碼*/PRAGMAEXCEPTION_INIT(exception_deptno_rema

29、ining,- 2292 );BEGINDELETE FROMdeptWHERE dept.deptno= remove_dept.deptno;.下載可編輯 .IF SQL%NOTFOUNDTHENRAISE no_result;END IF;total_depts:=total_depts-1 ; - 總的部門數(shù)減1EXCEPTIONWHENno_resultTHENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :你需要的數(shù)據(jù)不存在!' );WHENexception_deptno_remainingTHENDBMS_OUTPUT.PUT_LINE(' 溫

30、馨提示 :違反數(shù)據(jù)完整性約束!' );WHENOTHERS THENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END remove_dept;- 給指定員工增加指定數(shù)量的工資PROCEDUREincrease_sal(empnoNUMBER , sal_incrNUMBER )IScurr_salNUMBER (7 , 2 ); - 當(dāng)前工資BEGIN- 得到當(dāng)前工資SELECT sal INTOcurr_salFROMempWHERE emp.empno= increase_sal.empno;IF curr_salIS NUL

31、LTHENRAISE no_sal;ELSEUPDATEempSET sal = sal +increase_sal.sal_incr- 當(dāng)前工資加新增的工資WHERE emp.empno= increase_sal.empno;END IF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :你需要的數(shù)據(jù)不存在!' );WHENno_salTHENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :此員工的工資不存在!' );WHENOTHERS THENDBMS_OUTPUT.PUT_L

32、INE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END increase_sal;- 給指定員工增加指定數(shù)量的獎金PROCEDUREincrease_comm(empnoNUMBER , comm_incrNUMBER )IScurr_commNUMBER (7,2 );BEGIN- 得到指定員工的當(dāng)前資金SELECT commINTOcurr_comm.下載可編輯 .FROMempWHERE emp.empno=increase_comm.empno;IF curr_commIS NULLTHENRAISE no_comm;ELSEUPDATEempSET comm=comm

33、+increase_m_incrWHERE emp.empno= increase_comm.empno;END IF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :你需要的數(shù)據(jù)不存在!' );WHENno_commTHENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :此員工的獎金不存在!' );WHENOTHERS THENDBMS_OUTPUT.PUT_LINE(' 溫馨提示 :發(fā)生系統(tǒng)錯誤 !' );END increase_comm;END MANAGE_

34、EMP_PKG; - 創(chuàng)建包體結(jié)束- 調(diào)用SQL>variableempnonumberSQL> execute:empno: =manage_emp_pkg.hire_emp('HUYONG',PM, 1455 ,5500 ,14,10)PL/ SQL proceduresuccessfullycompletedempno-105例 4:利用游標(biāo)變量創(chuàng)建包CURROR_VARIBAL_PKG。 由于游標(biāo)變量指是一個指針,其狀態(tài)是不確定的 ,因此它不能隨同包存儲在數(shù)據(jù)庫中,既不能在PL/SQL 包中聲明游標(biāo)變量。但在包中可以創(chuàng)建游標(biāo)變量參照類型,并可向包中的子程序傳

35、遞游標(biāo)變量參數(shù)。- *- 創(chuàng)建包體- 包 名: CURROR_VARIBAL_PKG- 功能描述 :在包中引用游標(biāo)變量- 創(chuàng)建人員 :胡勇- 創(chuàng)建日期 : 2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: - *CREATE OR REPLACE PACKAGECURROR_VARIBAL_PKGAS.下載可編輯 .TYPE DeptCurTypeIS REF CURSORRETURNdept %ROWTYPE;- 強(qiáng)類型定義TYPE CurTypeIS REF CURSOR ;-弱類型定義PROCEDUREOpenDeptVar(C

36、v INOUT DeptCurType,ChoiceINTEGER DEFAULT0 ,Dept_noNUMBERDEFAULT50 ,Dept_nameVARCHARDEFAULT'%' );END ;- *- 創(chuàng)建包體- 包 名: CURROR_VARIBAL_PKG- 功能描述 :在包中引用游標(biāo)變量- 創(chuàng)建人員 :胡勇- 創(chuàng)建日期 : 2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: - *CREATE OR REPLACE PACKAGE BODY CURROR_VARIBAL_PKG ASPROCEDUREO

37、penDeptvar(Cv INOUT DeptCurType,ChoiceINTEGER DEFAULT0 ,Dept_noNUMBERDEFAULT50 ,Dept_nameVARCHARDEFAULT% )ISBEGINIF choice= 1 THENOPEN cv FOR SELECT * FROM dept WHERE deptno <= dept_no; ELSIF choice = 2 THENOPEN cvFOR SELECT * FROMdeptWHERE dnameLIKE dept_name;ELSEOPEN cvFOR SELECT * FROMdept;END

38、 IF;END OpenDeptvar;END CURROR_VARIBAL_PKG;- 定義一個過程CREATE OR REPLACE PROCEDURE UP_OpenCurType(Cv INOUT CURROR_VARIBAL_PKG.CurType,.下載可編輯 .FirstCapInTableNameCHAR )ASBEGIN-CURROR_VARIBAL_PKG.CurType采用弱類型定義- 所以可以使用它定義的游標(biāo)變量打開不同類型的查詢語句IF FirstCapInTableName= 'D'THENOPENcvFOR SELECT *FROMdept;ELS

39、EOPEN cvFOR SELECT * FROMemp;ENDIF;ENDUP_OpenCurType;- 定義一個應(yīng)用DECLAREDeptRecDept %ROWTYPE;EmpRecEmp %ROWTYPE;Cv1CURROR_VARIBAL_PKG.deptcurtype;Cv2CURROR_VARIBAL_PKG.curtype;BEGINDBMS_OUTPUT.PUT_LINE(' 游標(biāo)變量強(qiáng)類型定義應(yīng)用');CURROR_VARIBAL_PKG.OpenDeptVar(cv1,1, 30);FETCH cv1INTODeptRec;WHILEcv1 %FOUND

40、LOOPDBMS_OUTPUT.PUT_LINE(DeptRec.deptno| ':' | DeptRec.dname);FETCH cv1INTODeptRec;END LOOP;CLOSE cv1;DBMS_OUTPUT.PUT_LINE(' 游標(biāo)變量弱類型定義應(yīng)用');CURROR_VARIBAL_PKG.OpenDeptvar(cv2,2, dept_name=>'A%' );FETCH cv2INTODeptRec;WHILEcv2 %FOUNDLOOPDBMS_OUTPUT.PUT_LINE(DeptRec.deptno| &

41、#39;:' | DeptRec.dname);FETCH cv2INTODeptRec;END LOOP;DBMS_OUTPUT.PUT_LINE(' 游標(biāo)變量弱類型定義應(yīng)用dept 表 ');UP_OpenCurType(cv2,'D' );FETCH cv2INTODeptRec;WHILEcv2 %FOUNDLOOPDBMS_OUTPUT.PUT_LINE(deptrec.deptno|':' | deptrec.dname);FETCH cv2INTOdeptrec;END LOOP;.下載可編輯 .DBMS_OUTPUT.PU

42、T_LINE(' 游標(biāo)變量弱類型定義應(yīng)用emp 表 ');UP_OpenCurType(cv2,'E' );FETCH cv2INTOEmpRec;WHILEcv2 %FOUNDLOOPDBMS_OUTPUT.PUT_LINE(emprec.empno| ':' | emprec.ename);FETCH cv2INTOemprec;END LOOP;CLOSE cv2;END ;-運(yùn)行結(jié)果 -游標(biāo)變量強(qiáng)類型定義應(yīng)用10:ACCOUNTING20:RESEARCH30:SALES游標(biāo)變量弱類型定義應(yīng)用10:ACCOUNTING游標(biāo)變量弱類型定義應(yīng)

43、用 dept表10:ACCOUNTING20:RESEARCH30:SALES40:OPERATIONS50:50abc60:Developer游標(biāo)變量弱類型定義應(yīng)用 emp 表7369 :SMITH7499 :ALLEN7521 :WARD7566 :JONES7654 :MARTIN7698 :BLAKE7782 :CLARK7788 :SCOTT7839 :KING7844 :TURNER7876 :ADAMS7900 :JAMES7902 :FORD7934 :MILLERPL/ SQL proceduresuccessfullycompleted7.5 子程序重載.下載可編輯 .PL/SQL允許對包內(nèi)子程序和本地子程序進(jìn)行重載。所謂重載時指兩個或多個子程序有相同的名稱 ,但擁有不同的參數(shù)變量、參數(shù)順序或參數(shù)數(shù)據(jù)類型。例 5:- *- 創(chuàng)建包說明- 包 名: DEMO_PKG1- 功能描述 :創(chuàng)建包對子程序重載進(jìn)行測試- 創(chuàng)建人員 :胡勇- 創(chuàng)建日期 : 2010-05-22- Q Q: 80368704- E-mail : 80368704- WebSite: - *CREATE OR REPLACE PACKAGEDEMO_PKG1ISDeptRecdept %ROWTYPE;V_sqlcodeNUMBER ;V_sqle

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論