
示例一、根據輸入的部門編號找到這個部門的所有員工
首先創建包,定義包規范
create or replace package getemp_pkg is FUNCTION getemp_fun(p_dno dept.deptno%type) RETURN SYS_REFCURSOR; --返回弱類型游標 end getemp_pkg;
執行後自動生成包的主體
定義包的主體(實現體)
create or replace package body getemp_pkg AS FUNCTION getemp_fun(p_dno dept.deptno%TYPE) RETURN SYS_REFCURSOR --返回弱類型游標 AS cur_emp SYS_REFCURSOR; begin OPEN cur_emp FOR SELECT * FROM emp WHERE deptno=p_dno; --打開游標 RETURN cur_emp; --返回游標 END getemp_fun; end getemp_pkg;
調用包
DECLARE
V_EMP EMP%ROWTYPE; --定義變量來接收游標的內容
CUR_EMP SYS_REFCURSOR; --定義游標來接收返回游標
V_DNO DEPT.DEPTNO%TYPE; --定義部門編號,轉入參數
BEGIN
CUR_EMP := GETEMP_PKG.GETEMP_FUN(&V_DNO);
LOOP
FETCH CUR_EMP --提取游標
INTO V_EMP;
EXIT WHEN CUR_EMP%NOTFOUND; --退出條件
DBMS_OUTPUT.PUT_LINE(CUR_EMP%ROWCOUNT || ' 員工編號:' || V_EMP.EMPNO ||
' 姓名:' || V_EMP.ENAME);
END LOOP;
CLOSE cur_emp; --關閉游標
END;
示例二、包中有過程和函數
程序包規范
create or replace package pack_me is PROCEDURE emp_proc(num NUMBER); FUNCTION emp_fun(eno NUMBER) RETURN VARCHAR2; end pack_me;
程序包主體
create or replace package body pack_me is
PROCEDURE emp_proc(num NUMBER) IS
v_name VARCHAR2(50);
BEGIN
SELECT ename INTO v_name FROM emp WHERE empno=num;
dbms_output.put_line('員工編號:'||num||' 的姓名:'||v_name);
END emp_proc;
FUNCTION emp_fun(eno NUMBER) RETURN VARCHAR2
AS
v_job varchar2(50);
BEGIN
SELECT job INTO v_job FROM emp WHERE empno=eno;
RETURN v_job;
--dbms_output.put_line('員工編號:'||empno||' 的職位:'||v_job);
END emp_fun;
end pack_me;
執行
--程序包
DECLARE
v_empno emp.empno%TYPE:=&empno;
v_job Varchar2(50);
BEGIN
pack_me.emp_proc(v_empno);
v_job:=pack_me.emp_fun(v_empno);
dbms_output.put_line('員工編號:'||v_empno||' 的職位:'||v_job);
END;
查詢包
--查詢user_objects數據字典確認包規范及包體
SELECT object_type,object_name,status FROM User_Objects WHERE object_type IN('PACKAGE','PACKAGE BODY');
--查詢包的內容 SELECT * FROM user_source WHERE TYPE='PACKAGE' AND NAME='GETEMP_PKG';
刪除包
刪除包規范
DROP PACKAGE 包名稱
刪除包體
DROP PACKAGE BODY包名稱
刪除包規范裡會對其對應的包體一起刪除
包的重新編譯
ALTER PACKAGE 包名稱 COMPILE PACKAGE; --示例 ALTER PACKAGE GETEMP_PKG COMPILE PACKAGE;
包的純度級別
語法:
PRAGMA restrict_references(函數名,WNDS[,WNPS][,RNDS][,RUPS])