程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 程序包(學習筆記),程序包學習筆記

程序包(學習筆記),程序包學習筆記

編輯:Oracle教程

程序包(學習筆記),程序包學習筆記


示例一、根據輸入的部門編號找到這個部門的所有員工

首先創建包,定義包規范

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])

NO 純度等級 說明 1 WNDS 函數不能悠數據庫表數據(無法使用DML更新) 2 RNDS 函數不能讀數據庫表(無法使用SELECT查詢) 3 WNPS 函數不允許悠包中的變量內容 4 RNPS 函數不允許讀取包中的變量內容

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved