Package 由 Specification(規格/宣告部) 與 Body(主體/實作部) 組成,可封裝函數、程序、型別、變數、游標、常數,實現模組化、資訊隱藏與效能優化(整體載入共享池)。
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;
/
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;
/
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;
/
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
SHOW ERRORS PACKAGE mypack 或查詢 USER_ERRORS 檢視編譯錯誤。DBMS_PIPE/DBMS_ALERT。PRIVATE 區塊。PKG_<模組> 命名慣例,避免名稱衝突。RETURN table%ROWTYPE,編譯期即可檢查結構匹配。