PL/SQL 包的概念及创建使用
包
1:概念
包是一組過程、函數(shù)、變量、常量和游標(biāo)等元素的組合。是對這些PL/SQL 程序設(shè)計元素的封裝。其中變量相當(dāng)于類中的成員變量,過程和函數(shù)相當(dāng)于類方法。把相關(guān)的模塊歸類成包,可使開發(fā)人員利用面向?qū)ο蟮姆椒ㄟM(jìn)行存儲過程的開發(fā)。
2:包的組成部分:
(1)包定義(PACKAGE):包定義部分聲明包內(nèi)數(shù)據(jù)類型、變量、常量、游標(biāo)、子程序和異常錯誤處理等元素,這些元素為包的公有元素。
(2)包主體(PACKAGE BODY):包主體則是包定義部分的具體實現(xiàn),它定義了包定義部分所聲明的游標(biāo)和子程序,在包主體中還可以聲明包的私有元素。
包定義和包主體分開編譯,并作為兩部分分開的對象存放在數(shù)據(jù)庫字典中。
3:包的定義(PACKAGE):
包定義的語法:
CREATE [OR REPLACE] PACKAGE package_name
{IS | AS}
[公有數(shù)據(jù)類型定義[公有數(shù)據(jù)類型定義]…]
[公有游標(biāo)聲明[公有游標(biāo)聲明]…]
[公有變量、常量聲明[公有變量、常量聲明]…]
[公有子程序聲明[公有子程序聲明]…]END [package_name];
4:包體定義(PACKAGE BODY):
包體定義語法:
CREATE [OR REPLACE] PACKAGE BODY package_name{IS | AS}
[私有數(shù)據(jù)類型定義[私有數(shù)據(jù)類型定義]…]
[私有變量、常量聲明[私有變量、常量聲明]…]
[私有子程序聲明和定義[私有子程序聲明和定義]…]
[公有子程序定義[公有子程序定義]…]
BEGIN
PL/SQL 語句END [package_name];
其中:在包主體定義公有程序時,它們必須與包定義中所聲明子程序的格式完全一致
5:創(chuàng)建包舉例
例:--1:包定義
CREATE OR REPLACE PACKAGE demo_pack
IS
DeptRec dept%ROWTYPE;
FUNCTION add_dept( dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
RETURN NUMBER;
FUNCTION remove_dept(dept_no NUMBER)
RETURN NUMBER;
PROCEDURE query_dept(dept_no IN NUMBER);
END demo_pack;
--2:定義包體
CREATE OR REPLACE PACKAGE BODY demo_pack
IS
FUNCTION add_dept (dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
RETURN NUMBER
IS
empno_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(empno_remaining, -1); --/* -1 是違反唯一約束條件的錯誤代碼 */
--3:程序執(zhí)行部分
BEGIN
INSERT INTO dept VALUES(dept_no, dept_name, location);
IF SQL%FOUND THEN
RETURN 1;
END IF;
EXCEPTION
WHEN empno_remaining THEN
RETURN 0;
WHEN OTHERS THEN
RETURN -1;
END add_dept;
FUNCTION remove_dept(dept_no NUMBER)
RETURN NUMBER IS
BEGIN
DELETE FROM dept WHERE deptno=dept_no;
IF SQL%FOUND THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
EXCEPTION
WHEN OTHERS THEN RETURN -1;
END remove_dept;
PROCEDURE query_dept (dept_no IN NUMBER)
IS
BEGIN
SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫中沒有編碼為'||dept_no||'的部門');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('程序運行錯誤!請使用游標(biāo)');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
END query_dept;END demo_pack;
--4:調(diào)用包應(yīng)用舉例
DECLARE
Var NUMBER;BEGIN
Var := demo_pack.add_dept(90,'Administration', 'Beijing');
IF var =-1 THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
ELSIF var =0 THEN
DBMS_OUTPUT.PUT_LINE('該部門記錄已經(jīng)存在!');
ELSE
DBMS_OUTPUT.PUT_LINE('添加記錄成功!');
Demo_pack.query_dept(90);
DBMS_OUTPUT.PUT_LINE(demo_pack.DeptRec.deptno||'---'|| demo_pack.DeptRec.dname||'---'||demo_pack.DeptRec.loc); var := demo_pack.remove_dept(90);
IF var =-1 THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
ELSIF var=0 THEN
DBMS_OUTPUT.PUT_LINE('該部門記錄不存在!');
ELSE
DBMS_OUTPUT.PUT_LINE('刪除記錄成功!');
END IF;
END IF;
END;
?
6:子程序重載
子程序重載是指:在包內(nèi)有兩個或多個子程序同名,不同參,包括參數(shù)變量,參數(shù)順序,數(shù)據(jù)類型不同。
例:
FUNCTION query_dept(dept_no IN NUMBER)
RETURN INTEGER
IS
BEGIN
IF dept_no =10 THEN
SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;
RETURN 1;
ELSE
RETURN 0;
END IF;
END query_dept;
--重載
FUNCTION query_dept(dept_no IN VARCHAR2)
RETURN INTEGER
IS
BEGIN
IF dept_no =10 THEN
SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;
RETURN 1;
ELSE
RETURN 0;
END IF;
END query_dept;
END demo_pack1;
轉(zhuǎn)載于:https://www.cnblogs.com/maqiang123/p/7270162.html
總結(jié)
以上是生活随笔為你收集整理的PL/SQL 包的概念及创建使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最具体Android集成QQ,微信,
- 下一篇: 性能测试相关名词解释