首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Package(套件)完整教學:規格、主體、游標型別、公共變數與呼叫範例

     編輯:Oracle 資料庫基礎

Package 架構概覽

Package 由 Specification(規格/宣告部) 與 Body(主體/實作部) 組成,可封裝函數、程序、型別、變數、游標、常數,實現模組化、資訊隱藏與效能優化(整體載入共享池)。

完整範例:封裝 REF CURSOR 函數

1. 規格部

CREATE OR REPLACE PACKAGE mypack AS
  -- 定義強型別 REF CURSOR,回傳 emp 表列結構
  TYPE mytype IS REF CURSOR RETURN emp%ROWTYPE;

  -- 對外公開函數
  FUNCTION myemp(dno NUMBER) RETURN mytype;
END mypack;
/

2. 主體部

CREATE OR REPLACE PACKAGE BODY mypack AS
  FUNCTION myemp(dno NUMBER) RETURN mytype AS
    eee mytype;
  BEGIN
    OPEN eee FOR SELECT * FROM emp WHERE deptno = dno;
    RETURN eee;
  END myemp;
END mypack;
/

3. 呼叫範例

DECLARE
  e      mypack.mytype;      -- 宣告套件型別變數
  eee    emp%ROWTYPE;        -- 单行记录变量
BEGIN
  e := mypack.myemp(20);     -- 呼叫函數取得游標
  LOOP
    FETCH e INTO eee;
    EXIT WHEN e%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(eee.empno || ',' || eee.ename || ',' || eee.job);
  END LOOP;
  CLOSE e;                   -- 良好習慣:显式关闭游標
END;
/

Package 進階特性

公共變數(Session 級共享狀態)

CREATE OR REPLACE PACKAGE pkg_state AS
  g_counter NUMBER := 0;           -- 初始化
  PROCEDURE inc;
  FUNCTION  get_val RETURN NUMBER;
END pkg_state;
/

CREATE OR REPLACE PACKAGE BODY pkg_state AS
  PROCEDURE inc IS BEGIN g_counter := g_counter + 1; END;
  FUNCTION get_val RETURN NUMBER IS BEGIN RETURN g_counter; END;
END pkg_state;
/
-- 不同 PL/SQL 區塊同一 Session 呼叫可見計數器遞增

自定義型別跨程序共用

CREATE OR REPLACE PACKAGE pkg_types AS
  TYPE rec_emp IS RECORD (id NUMBER, name VARCHAR2(30));
  TYPE tab_emp IS TABLE OF rec_emp INDEX BY PLS_INTEGER;
  PROCEDURE process(p_data IN OUT tab_emp);
END pkg_types;
/
-- 其他程序可直接引用 pkg_types.rec_emp、pkg_types.tab_emp

編譯與除錯提示

  • 規格部變更會導致所有引用該 Package 的物件 INVALID,需重新編譯;主體部變更不影響依賴物件。
  • 使用 SHOW ERRORS PACKAGE mypack 或查詢 USER_ERRORS 檢視編譯錯誤。
  • Package 變數生命週期 = Session,跨 Session 不共享;若需跨 Session 共享狀態,請使用資料表或 DBMS_PIPE/DBMS_ALERT。

最佳實務

  1. 將介面(規格)與實作(主體)分離,介面盡量穩定。
  2. 公開最小必要的程序/函數/型別,內部輔助程序置於主體部 PRIVATE 區塊。
  3. 大型系統建議採用 PKG_<模組> 命名慣例,避免名稱衝突。
  4. 游標型別優先使用強型別 RETURN table%ROWTYPE,編譯期即可檢查結構匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved