




已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔ORACLE PL/SQL編程詳解之七:程序包的創(chuàng)建與應(yīng)用(聰明在于學(xué)習(xí),天才在于積累!)本篇主要內(nèi)容如下:第七章 程序包的創(chuàng)建和應(yīng)用7.1 程序包簡(jiǎn)介7.2 程序包的定義7.3 包的開發(fā)步驟7.4 包定義的說明7.5 子程序重載7.6 加密實(shí)用程序7.7 刪除包7.8 包的管理7.1 程序包簡(jiǎn)介程序包(PACKAGE,簡(jiǎn)稱包)是一組相關(guān)過程、函數(shù)、變量、常量和游標(biāo)等PL/SQL程序設(shè)計(jì)元素的組合,作為一個(gè)完整的單元存儲(chǔ)在數(shù)據(jù)庫中,用名稱來標(biāo)識(shí)包。它具有面向?qū)ο蟪绦蛟O(shè)計(jì)語言的特點(diǎn),是對(duì)這些PL/SQL 程序設(shè)計(jì)元素的封裝。包類似于c#和JAVA語言中的類,其中變量相當(dāng)于類中的成員變量,過程和函數(shù)相當(dāng)于類方法。把相關(guān)的模塊歸類成為包,可使開發(fā)人員利用面向?qū)ο蟮姆椒ㄟM(jìn)行存儲(chǔ)過程的開發(fā),從而提高系統(tǒng)性能。與高級(jí)語言中的類相同,包中的程序元素也分為公用元素和私用元素兩種,這兩種元素的區(qū)別是他們?cè)试S訪問的程序范圍不同,即它們的作用域不同。公用元素不僅可以被包中的函數(shù)、過程所調(diào)用,也可以被包外的PL/SQL程序訪問,而私有元素只能被包內(nèi)的函數(shù)和過程序所訪問。當(dāng)然,對(duì)于不包含在程序包中的過程、函數(shù)是獨(dú)立存在的。一般是先編寫?yīng)毩⒌倪^程與函數(shù),待其較為完善或經(jīng)過充分驗(yàn)證無誤后,再按邏輯相關(guān)性組織為程序包。程序包的優(yōu)點(diǎn)u 簡(jiǎn)化應(yīng)用程序設(shè)計(jì):程序包的說明部分和包體部分可以分別創(chuàng)建各編譯。主要體現(xiàn)在以下三個(gè)方面:1) 可以在設(shè)計(jì)一個(gè)應(yīng)用程序時(shí),只創(chuàng)建各編譯程序包的說明部分,然后再編寫引用該 程序包的PL/SQL塊。2) 當(dāng)完成整個(gè)應(yīng)用程序的整體框架后,再回頭來定義包體部分。只要不改變包的說明部分,就可以單獨(dú)調(diào)試、增加或替換包體的內(nèi)容,這不會(huì)影響其他的應(yīng)用程序。3) 更新包的說明后必須重新編譯引用包的應(yīng)用程序,但更新包體,則不需重新編譯引用包的應(yīng)用程序,以快速進(jìn)行應(yīng)用程序的原形開發(fā)。u 模塊化:可將邏輯相關(guān)的PL/SQL塊或元素等組織在一起,用名稱來唯一標(biāo)識(shí)程序 包。把一個(gè)大的功能模塊劃分人適當(dāng)個(gè)數(shù)小的功能模塊,分別完成各自的功能。這樣組織的程序包都易于編寫,易于理解更易于管理。u 信息隱藏:因?yàn)榘械脑乜梢苑譃楣性睾退接性?。公有元素可被程序包?nèi)的過程、函數(shù)等的訪問,還可以被包外的PL/SQL訪問。但對(duì)于私有元素只能被包內(nèi)的過程、函數(shù)等訪問。對(duì)于用戶,只需知道包的說明,不用了解包休的具體細(xì)節(jié)。u 效率高:程序包在應(yīng)用程序第一次調(diào)用程序包中的某個(gè)元素時(shí),ORACLE將把整個(gè)程序包加載到內(nèi)存中,當(dāng)?shù)诙卧L問程序包中的元素時(shí),ORACLE將直接從內(nèi)在中讀取,而不需要進(jìn)行磁盤I/O操作而影響速度,同時(shí)位于內(nèi)在中的程序包可被同一會(huì)話期間的其它應(yīng)用程序共享。因此,程序包增加了重用性并改善了多用戶、多應(yīng)用程序環(huán)境的效率。對(duì)程序包的優(yōu)點(diǎn)可總結(jié)如下:在PL/SQL程序設(shè)計(jì)中,使用包不僅可以使程序設(shè)計(jì)模塊化,對(duì)外隱藏包內(nèi)所使用的信息(通過使用私用變量),而寫可以提高程序的執(zhí)行效率。因?yàn)?,?dāng)程序首次調(diào)用包內(nèi)函數(shù)或過程時(shí),ORACLE將整個(gè)包調(diào)入內(nèi)存,當(dāng)再次訪問包內(nèi)元素時(shí),ORACLE直接從內(nèi)存中讀取,而不需要進(jìn)行磁盤I/O操作,從而使程序執(zhí)行效率得到提高。一個(gè)包由兩個(gè)分開的部分組成:包說明(PACKAGE):包說明部分聲明包內(nèi)數(shù)據(jù)類型、變量、常量、游標(biāo)、子程序和異常錯(cuò)誤處理等元素,這些元素為包的公有元素。包主體(PACKAGE BODY):包主體則是包定義部分的具體實(shí)現(xiàn),它定義了包定義部分所聲明的游標(biāo)和子程序,在包主體中還可以聲明包的私有元素。包說明和包主體分開編譯,并作為兩部分分開的對(duì)象存放在數(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)信息的隱藏,建議不要將所有組件都放在包說明處聲明,只應(yīng)把公共組件放在包聲明部分。包的名稱是唯一的,但對(duì)于兩個(gè)包中的公有組件的名稱可以相同,這種用“包名.公有組件名“加以區(qū)分。包體是包的具體實(shí)現(xiàn)細(xì)節(jié),其實(shí)現(xiàn)在包說明中聲明的所有公有過程、函數(shù)、游標(biāo)等。當(dāng)然也可以在包體中聲明僅屬于自己的私有過程、函數(shù)、游標(biāo)等。創(chuàng)建包體時(shí),有以下幾點(diǎn)需要注意:u 包體只能在包說明被創(chuàng)建或編譯后才能進(jìn)行創(chuàng)建或編譯。u 在包體中實(shí)現(xiàn)的過程、函數(shù)、游標(biāo)的名稱必須與包說明中的過程、函數(shù)、游標(biāo)一致,包括名稱、參數(shù)的名稱以及參數(shù)的模式(IN、OUT、IN OUT)。并建設(shè)按包說明中的次序定義包體中具體的實(shí)現(xiàn)。u 在包體中聲明的數(shù)據(jù)類型、變量、常量都是私有的,只能在包體中使用而不能被印刷體外的應(yīng)用程序訪問與使用。u 在包體執(zhí)行部分,可對(duì)包說明,包體中聲明的公有或私有變量進(jìn)行初始化或其它設(shè)置。創(chuàng)建程序包說明語法格式:CREATE OR REPLACE PACKAGE package_nameAUTHID CURRENT_USER | DEFINERIS | AS公有數(shù)據(jù)類型定義公有數(shù)據(jù)類型定義公有游標(biāo)聲明公有游標(biāo)聲明公有變量、常量聲明公有變量、常量聲明公有函數(shù)聲明公有函數(shù)聲明公有過程聲明公有過程聲明END package_name;其中:AUTHID CURRENT_USER和AUTHID DEFINER選項(xiàng)說明應(yīng)用程序在調(diào)用函數(shù)時(shí)所使用的權(quán)限模式,它們與CREATE FUNCTION語句中invoker_right_clause子句的作用相同。創(chuàng)建程序包主體語法格式:CREATE OR REPLACE PACKAGE BODY package_nameIS | AS私有數(shù)據(jù)類型定義私有數(shù)據(jù)類型定義私有變量、常量聲明私有變量、常量聲明私有異常錯(cuò)誤聲明私有異常錯(cuò)誤聲明私有函數(shù)聲明和定義私有函數(shù)聲明和定義私有函過程聲明和定義私有函過程聲明和定義公有游標(biāo)定義公有游標(biāo)定義公有函數(shù)定義公有函數(shù)定義公有過程定義公有過程定義BEGIN執(zhí)行部分(初始化部分)END package_name;其中:在包主體定義公有程序時(shí),它們必須與包定義中所聲明子程序的格式完全一致。7.3 包的開發(fā)步驟與開發(fā)存儲(chǔ)過程類似,包的開發(fā)需要幾個(gè)步驟:1 將每個(gè)存儲(chǔ)過程調(diào)式正確;2 用文本編輯軟件將各個(gè)存儲(chǔ)過程和函數(shù)集成在一起;3 按照包的定義要求將集成的文本的前面加上包定義;4 按照包的定義要求將集成的文本的前面加上包主體;5 使用SQLPLUS或開發(fā)工具進(jìn)行調(diào)式。7.4 包定義的說明例1:創(chuàng)建的包為DEMO_PKG, 該包中包含一個(gè)記錄變量DEPTREC、兩個(gè)函數(shù)和一個(gè)過程。實(shí)現(xiàn)對(duì)dept表的增加、刪除與查詢。CREATE OR REPLACE PACKAGE DEMO_PKGISDEPTREC DEPT%ROWTYPE;-Add dept.FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)RETURN NUMBER;-delete dept.FUNCTION delete_dept(dept_no NUMBER)RETURN NUMBER;-query dept.PROCEDURE query_dept(dept_no IN NUMBER);END DEMO_PKG;包主體的創(chuàng)建方法,它實(shí)現(xiàn)上面所聲明的包定義,并在包主體中聲明一個(gè)私有變量flag和一個(gè)私有函數(shù)check_dept,由于在add_dept和remove_dept等函數(shù)中需要調(diào)用check_dpet函數(shù),所以,在定義check_dept 函數(shù)之前首先對(duì)該函數(shù)進(jìn)行聲明,這種聲明方法稱作前向聲明。CREATE OR REPLACE PACKAGE BODY DEMO_PKGIS FUNCTION add_dept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)RETURN NUMBERIS empno_remaining EXCEPTION; -自定義異常PRAGMA EXCEPTION_INIT(empno_remaining, -1);/* -1 是違反唯一約束條件的錯(cuò)誤代碼 */BEGININSERT INTO dept VALUES(dept_no, dept_name, location);IF SQL%FOUND THENRETURN 1;END IF;EXCEPTIONWHEN empno_remaining THEN RETURN 0;WHEN OTHERS THENRETURN -1;END add_dept;FUNCTION delete_dept(dept_no NUMBER)RETURN NUMBERIS BEGINDELETE FROM dept WHERE deptno = dept_no;IF SQL%FOUND THENRETURN 1;ELSERETURN 0;END IF;EXCEPTIONWHEN OTHERS THENRETURN -1;END delete_dept;PROCEDURE query_dept(dept_no IN NUMBER)ISBEGINSELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;EXCEPTIONWHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:數(shù)據(jù)庫中沒有編碼為|dept_no|的部門);WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE(程序運(yùn)行錯(cuò)誤,請(qǐng)使用游標(biāo)進(jìn)行操作!);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END query_dept;BEGIN Null;END DEMO_PKG;對(duì)包內(nèi)共有元素的調(diào)用格式為:包名.元素名稱調(diào)用DEMO_PKG包內(nèi)函數(shù)對(duì)dept表進(jìn)行插入、查詢和刪除操作,并通過DEMO_PKG包中的記錄變量DEPTREC顯示所查詢到的數(shù)據(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.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(溫馨提示:該部門記錄不存在!);ELSEDBMS_OUTPUT.PUT_LINE(溫馨提示:刪除記錄成功!);END IF;END IF;END;例2: 創(chuàng)建包EMP_PKG,讀取emp表中的數(shù)據(jù)-創(chuàng)建包說明CREATE OR REPLACE PACKAGE EMP_PKG ISTYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;PROCEDURE read_emp_table (p_emp_table OUT emp_table_type);END EMP_PKG;-創(chuàng)建包體CREATE OR REPLACE PACKAGE BODY EMP_PKG ISPROCEDURE read_emp_table (p_emp_table OUT emp_table_type) ISI BINARY_INTEGER := 0;BEGINFOR emp_record IN ( SELECT * FROM emp ) LOOPP_emp_table(i) := emp_record;I := I + 1;END LOOP;END read_emp_table;END EMP_PKG;-執(zhí)行DECLARE E_table EMP_PKG.emp_table_type;BEGINEMP_PKG.read_emp_table(e_table);FOR I IN e_table.FIRST .e_table.LAST LOOPDBMS_OUTPUT.PUT_LINE(e_table(i).empno| |e_table(i).ename);END LOOP;END;例3: 創(chuàng)建包MANAGE_EMP_PKG,對(duì)員工進(jìn)行管理(新增員工、新增部門、刪除指定員工、刪除指定部門、增加指定員工的工資與獎(jiǎng)金):-創(chuàng)建序列從100開始,依次增加1CREATE SEQUENCE empseq START WITH 100 INCREMENT BY 1 ORDER NOCYCLE;-創(chuàng)建序列從100開始,依次增加10CREATE SEQUENCE deptseqSTART WITH 100INCREMENT BY 10 ORDER NOCYCLE;- *- 創(chuàng)建包說明- 包 名:MANAGE_EMP_PKG - 功能描述:對(duì)員工進(jìn)行管理(新增員工,新增部門- ,刪除員工,刪除部門,增加工資與獎(jiǎng)金等)- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE MANAGE_EMP_PKG AS-增加一名員工 FUNCTION hire_emp(ename VARCHAR2, job VARCHAR2, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER)RETURN NUMBER;-新增一個(gè)部門FUNCTION add_dept(dname VARCHAR2, loc VARCHAR2)RETURN NUMBER;-刪除指定員工PROCEDURE remove_emp(empno NUMBER);-刪除指定部門PROCEDURE remove_dept(deptno NUMBER);-增加指定員工的工資PROCEDURE increase_sal(empno NUMBER, sal_incr NUMBER);-增加指定員工的獎(jiǎng)金PROCEDURE increase_comm(empno NUMBER, comm_incr NUMBER);END MANAGE_EMP_PKG;-創(chuàng)建包說明結(jié)束- *- 創(chuàng)建包體- 包 名:MANAGE_EMP_PKG - 功能描述:對(duì)員工進(jìn)行管理(新增員工,新增部門- ,刪除員工,刪除部門,增加工資與獎(jiǎng)金等)- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE BODY MANAGE_EMP_PKG AStotal_emps NUMBER; -員工數(shù)total_depts NUMBER; -部門數(shù)no_sal EXCEPTION;no_comm EXCEPTION;-增加一名員工 FUNCTION hire_emp(ename VARCHAR2, job VARCHAR2, mgr NUMBER,sal NUMBER, comm NUMBER, deptno NUMBER)RETURN NUMBER -返回新增加的員工編號(hào)ISnew_empno NUMBER(4);BEGINSELECT empseq.NEXTVAL INTO new_empno FROM dual;SELECT COUNT(*) INTO total_emps FROM emp;-當(dāng)前記錄總數(shù)INSERT INTO emp VALUES (new_empno, ename, job, mgr, sysdate, sal, comm, deptno);total_emps:=total_emps+1;RETURN(new_empno);EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END hire_emp;-新增一個(gè)部門FUNCTION add_dept(dname VARCHAR2, loc VARCHAR2)RETURN NUMBER ISnew_deptno NUMBER(4); -部門編號(hào)BEGIN-得到一個(gè)新的自增的員工編號(hào)SELECT deptseq.NEXTVAL INTO new_deptno FROM dual;SELECT COUNT(*) INTO total_depts FROM dept;-當(dāng)前部門總數(shù)INSERT INTO dept VALUES (new_deptno, dname, loc);total_depts:=total_depts;RETURN(new_deptno);EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END add_dept;-刪除指定員工PROCEDURE remove_emp(empno NUMBER) ISno_result EXCEPTION; -自定義異常BEGIN DELETE FROM emp WHERE emp.empno=remove_emp.empno;IF SQL%NOTFOUND THENRAISE no_result;END IF;total_emps:=total_emps - 1; -總的員工數(shù)減1EXCEPTIONWHEN no_result THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:你需要的數(shù)據(jù)不存在!);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END remove_emp;-刪除指定部門PROCEDURE remove_dept(deptno NUMBER) ISno_result EXCEPTION; -自定義異常exception_deptno_remaining EXCEPTION; -自定義異常/*-2292 是違反一致性約束的錯(cuò)誤代碼*/PRAGMA EXCEPTION_INIT(exception_deptno_remaining, -2292);BEGINDELETE FROM dept WHERE dept.deptno=remove_dept.deptno;IF SQL%NOTFOUND THENRAISE no_result;END IF;total_depts:=total_depts-1; -總的部門數(shù)減1EXCEPTIONWHEN no_result THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:你需要的數(shù)據(jù)不存在!);WHEN exception_deptno_remaining THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:違反數(shù)據(jù)完整性約束!);WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END remove_dept;-給指定員工增加指定數(shù)量的工資PROCEDURE increase_sal(empno NUMBER, sal_incr NUMBER)IScurr_sal NUMBER(7, 2); -當(dāng)前工資BEGIN-得到當(dāng)前工資SELECT sal INTO curr_sal FROM emp WHERE emp.empno=increase_sal.empno;IF curr_sal IS NULL THEN RAISE no_sal;ELSEUPDATE emp SET sal = sal + increase_sal.sal_incr -當(dāng)前工資加新增的工資 WHERE emp.empno = increase_sal.empno;END IF;EXCEPTIONWHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:你需要的數(shù)據(jù)不存在!);WHEN no_sal THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:此員工的工資不存在!);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END increase_sal;-給指定員工增加指定數(shù)量的獎(jiǎng)金PROCEDURE increase_comm(empno NUMBER, comm_incr NUMBER) IScurr_comm NUMBER(7,2);BEGIN -得到指定員工的當(dāng)前資金SELECT comm INTO curr_comm FROM emp WHERE emp.empno = increase_comm.empno;IF curr_comm IS NULL THEN RAISE no_comm;ELSEUPDATE emp SET comm = comm + increase_m_incrWHERE emp.empno=increase_comm.empno;END IF;EXCEPTIONWHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:你需要的數(shù)據(jù)不存在!);WHEN no_comm THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:此員工的獎(jiǎng)金不存在!);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(溫馨提示:發(fā)生系統(tǒng)錯(cuò)誤!);END increase_comm;END MANAGE_EMP_PKG;-創(chuàng)建包體結(jié)束-調(diào)用SQL variable empno numberSQLexecute :empno:= manage_emp_pkg.hire_emp(HUYONG,PM,1455,5500,14,10)PL/SQL procedure successfully completedempno-105例4:利用游標(biāo)變量創(chuàng)建包 CURROR_VARIBAL_PKG。由于游標(biāo)變量指是一個(gè)指針,其狀態(tài)是不確定的,因此它不能隨同包存儲(chǔ)在數(shù)據(jù)庫中,既不能在PL/SQL包中聲明游標(biāo)變量。但在包中可以創(chuàng)建游標(biāo)變量參照類型,并可向包中的子程序傳遞游標(biāo)變量參數(shù)。- *- 創(chuàng)建包體- 包 名:CURROR_VARIBAL_PKG - 功能描述:在包中引用游標(biāo)變量- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE CURROR_VARIBAL_PKG ASTYPE DeptCurType IS REF CURSOR RETURN dept%ROWTYPE; -強(qiáng)類型定義TYPE CurType IS REF CURSOR;- 弱類型定義PROCEDURE OpenDeptVar(Cv IN OUT DeptCurType,Choice INTEGER DEFAULT 0,Dept_no NUMBER DEFAULT 50,Dept_name VARCHAR DEFAULT %);END;- *- 創(chuàng)建包體- 包 名:CURROR_VARIBAL_PKG - 功能描述:在包中引用游標(biāo)變量- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-19- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE BODY CURROR_VARIBAL_PKGASPROCEDURE OpenDeptvar(Cv IN OUT DeptCurType,Choice INTEGER DEFAULT 0,Dept_no NUMBER DEFAULT 50,Dept_name VARCHAR DEFAULT %)IS BEGINIF choice =1 THENOPEN cv FOR SELECT * FROM dept WHERE deptno A%);FETCH cv2 INTO DeptRec;WHILE cv2%FOUND LOOPDBMS_OUTPUT.PUT_LINE(DeptRec.deptno|:|DeptRec.dname);FETCH cv2 INTO DeptRec;END LOOP;DBMS_OUTPUT.PUT_LINE(游標(biāo)變量弱類型定義應(yīng)用dept表);UP_OpenCurType(cv2, D);FETCH cv2 INTO DeptRec;WHILE cv2%FOUND LOOPDBMS_OUTPUT.PUT_LINE(deptrec.deptno|:|deptrec.dname);FETCH cv2 INTO deptrec;END LOOP;DBMS_OUTPUT.PUT_LINE(游標(biāo)變量弱類型定義應(yīng)用emp表);UP_OpenCurType(cv2, E);FETCH cv2 INTO EmpRec;WHILE cv2%FOUND LOOPDBMS_OUTPUT.PUT_LINE(emprec.empno|:|emprec.ename);FETCH cv2 INTO emprec;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)用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 procedure successfully completed7.5 子程序重載PL/SQL 允許對(duì)包內(nèi)子程序和本地子程序進(jìn)行重載。所謂重載時(shí)指兩個(gè)或多個(gè)子程序有相同的名稱,但擁有不同的參數(shù)變量、參數(shù)順序或參數(shù)數(shù)據(jù)類型。例5:- *- 創(chuàng)建包說明- 包 名:DEMO_PKG1 - 功能描述:創(chuàng)建包對(duì)子程序重載進(jìn)行測(cè)試- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-22- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE DEMO_PKG1ISDeptRec dept%ROWTYPE;V_sqlcode NUMBER;V_sqlerr VARCHAR2(2048);-兩個(gè)子程序名字相同,但參數(shù)類型不同F(xiàn)UNCTION query_dept(dept_no IN NUMBER)RETURN INTEGER;FUNCTION query_dept(dept_no IN VARCHAR2)RETURN INTEGER;END DEMO_PKG1;- *- 創(chuàng)建包體- 包 名:DEMO_PKG1 - 功能描述:創(chuàng)建包對(duì)子程序重載進(jìn)行測(cè)試- 創(chuàng)建人員:胡勇- 創(chuàng)建日期:2010-05-22- Q Q: 80368704- E-mail : 80368704- WebSite: /huyong- *CREATE OR REPLACE PACKAGE BODY DEMO_PKG1IS FUNCTION check_dept(dept_no NUMBER)RETURN INTEGERISdeptCnt INTEGER; -指定部門號(hào)的部門數(shù)量BEGINSELECT COUNT(*) INTO deptCnt FROM dept WHERE deptno = dept_no;IF deptCnt 0 THENRETURN 1;ELSERETURN 0;END IF;END check_dept;FUNCTION check_dep
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 離婚財(cái)產(chǎn)分割房產(chǎn)證變更與產(chǎn)權(quán)轉(zhuǎn)移合同
- 2025年初級(jí)會(huì)計(jì)職稱考試《初級(jí)會(huì)計(jì)實(shí)務(wù)》必考重點(diǎn)
- 《優(yōu)化飲食結(jié)構(gòu)的關(guān)鍵:水果攝入指南》課件
- 公共管理案例分析報(bào)告
- 《理解的有效途徑:課件中的傾聽藝術(shù)》
- 《健康飲食攻略》課件
- 《建筑玻璃裝飾材料》課件
- 航車安全使用培訓(xùn)
- 《代表張華》課件
- 《新冠病毒防控策略》課件
- 2025年5月12日全國防災(zāi)減災(zāi)日主題宣教課件
- 2024年濰坊寒亭區(qū)招聘中小學(xué)教師筆試真題
- 【淮安】2025年江蘇淮安市盱眙縣事業(yè)單位招聘工作人員87人筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 年人教版英語中考總復(fù)習(xí)專題(非謂語動(dòng)詞)動(dòng)詞不定式和動(dòng)名詞課件
- 柑橘采后處理技術(shù)優(yōu)化-全面剖析
- 浙江省鎮(zhèn)海市鎮(zhèn)海中學(xué)2025屆高考考前提分英語仿真卷含答案
- 2025年江蘇省常州市中考英語一模試卷
- 某煤礦項(xiàng)目申請(qǐng)報(bào)告(知識(shí)研究版本)
- 小麥種植技術(shù)試題及答案
- 2024年瓊海市城市投資運(yùn)營有限公司招聘筆試真題
- 職專汽修考試題及答案
評(píng)論
0/150
提交評(píng)論