1.概述
包用於將相關的對象組合在一起,一個任務,需要多個函數或者過程協同才能完成,這時,可以這些函數和存儲過程都放在一個包下,方便函數和存儲過程的管理,提高程序的性能,在第一次用的時候,會全部讀入內存,下次用直接從內存取,加強模塊化。
包分為兩部分:
1.包頭(類似java接口)
包的規范,只包含了函數或存儲過程的說明部分
創建包頭語法:
create [or replace] package 包名 is|as
--函數定義
function 函數名 [(參數列表)] return 返回類型;
--存儲過程定義
procedure 存儲過程名 [(參數列表)];
end [包名];
2.包體(類似java實現類)
實現包頭里定義的規范
創建包體語法:
create [or replace] package body 包名 is|as
--函數實現
function 函數名 [(參數列表)] return 返回類型 is|as
函數實現內容
--存儲過程實現
procedure 存儲過程名 [(參數列表)] is|as
存儲過程實現內容
end [包名];
2.實戰演練
-- 建立包
create or replace package emp_pkg is
TYPE t_ref_cursor is REF CURSOR;
FUNCTION get_emp_ref_cussor RETURN t_ref_cursor;
PROCEDURE update_emp_sal(
e_empno IN emp.empno%type,
e_sal number
);
end emp_pkg;
-- 建立包體
create or replace package body emp_pkg is
FUNCTION get_emp_ref_cussor RETURN t_ref_cursor IS
v_emp_ref_cursor t_ref_cursor;
BEGIN
OPEN v_emp_ref_cursor FOR
SELECT empno, ename, sal
FROM emp;
RETURN v_emp_ref_cursor;
END get_emp_ref_cussor;
PROCEDURE update_emp_sal(
e_empno IN emp.empno%type,
e_sal IN NUMBER
) AS
BEGIN
UPDATE emp SET SAL = SAL/e_sal WHERE empno = e_empno;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLERRM);
ROLLBACK;
END update_emp_sal;
END emp_pkg;
2.1 調度包中函數
select emp_pkg.get_emp_ref_cussor from dual;
輸出結果截圖:
2.2 調度包中的過程
CALL emp_pkg.update_emp_sal(7369, 10000)