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

PL/SQL Package(套件)完整指南:結構、範例、優勢與系統內建套件

     編輯:Oracle 教學

PL/SQL 套件:模組化、資訊隱藏與效能提升的核心機制

套件將邏輯相關的程序、函數、變數、游標、例外等封裝為單一命名模組,類似 C++/Java 的 Class 概念,是大型 PL/SQL 應用架構的基石。

套件兩大組成部分

部分關鍵字內容可見性
套件規格PACKAGE型別、變數、常數、游標、子程式**宣告**、例外Public(外部可見)
套件主體PACKAGE BODY子程式**實作**、私有變數/型別/子程式Private(僅內部可見)

規格與主體**獨立編譯**,分別儲存於資料字典,修改主體不影響依賴規格的物件,避免級聯重編譯。

語法範本

-- 套件規格
CREATE OR REPLACE PACKAGE pkg_name IS
  v_comm NUMBER := 200;                -- 公有變數
  TYPE rec_person IS RECORD (...);     -- 公有型別
  TYPE ref_cur IS REF CURSOR;          -- 公有游標型別
  FUNCTION get_year_sal(p_sal NUMBER) RETURN NUMBER;
  PROCEDURE add_person(p_id NUMBER, p_name VARCHAR2, p_age NUMBER, p_pwd VARCHAR2);
  PROCEDURE get_person(p_id IN NUMBER, p_cur OUT ref_cur);
END pkg_name;

-- 套件主體
CREATE OR REPLACE PACKAGE BODY pkg_name IS
  FUNCTION get_year_sal(p_sal NUMBER) RETURN NUMBER IS
  BEGIN RETURN (p_sal + v_comm) * 12; END;

  PROCEDURE add_person(p_id NUMBER, p_name VARCHAR2, p_age NUMBER, p_pwd VARCHAR2) IS
  BEGIN INSERT INTO person VALUES (p_id, p_name, p_age, p_pwd); COMMIT; END;

  PROCEDURE get_person(p_id IN NUMBER, p_cur OUT ref_cur) IS
  BEGIN OPEN p_cur FOR SELECT id, username, age, password FROM person; END;
END pkg_name;

呼叫範例

DECLARE
  v_cur  pkg_name.ref_cur;
  v_rec  pkg_name.rec_person;
BEGIN
  DBMS_OUTPUT.PUT_LINE('年薪=' || pkg_name.get_year_sal(12000));
  
  pkg_name.get_person(1, v_cur);
  LOOP
    FETCH v_cur INTO v_rec;
    EXIT WHEN v_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('姓名=' || v_rec.rusername);
  END LOOP;
  
  pkg_name.add_person(10001, 'zhangsan', 20, '1343');
END;

套件五大核心優勢

  1. 模組化:邏輯相關元素聚合,介面清晰,降低系統複雜度。
  2. 輕鬆程式設計:可先定義規格編譯,主體稍後實作;依賴規格的物件可先行編譯。
  3. 資訊隱藏:Public/Private 分離,實作變更不波及呼叫端,保護智慧財產與完整性。
  4. 附加功能:公有變數/游標在 Session 存活期內持久,跨交易共享狀態,無需寫表。
  5. 良好效能:首次呼叫載入整個套件至 SGA 共用池,後續呼叫零磁碟 I/O;阻斷級聯依賴,修改主體不觸發依賴物件重編譯。

常用系統內建套件速查

套件核心用途
DBMS_ALERT非同步事件通知,觸發器發送警報給應用程式。
DBMS_OUTPUTPUT_LINE/GET_LINE 除錯輸出,SQL*Plus 需 SET SERVEROUTPUT ON。
DBMS_PIPESession 間命名管道通訊(PACK_MESSAGE/SEND_MESSAGE/RECEIVE_MESSAGE/UNPACK_MESSAGE)。
UTL_FILEOS 文字檔讀寫(FOPEN/PUT_LINE/GET_LINE/FCLOSE),需建立 DIRECTORY 物件授權。
UTL_HTTPPL/SQL 呼叫 HTTP/HTTPS,抓取網頁或呼叫 Web Service,回傳 HTML/JSON/XML。

開發工具提示

  • PL/SQL Developer 中:**規格與主體必須分開執行**,先跑 CREATE PACKAGE ... END;,再跑 CREATE PACKAGE BODY ... END;。
  • 套件編譯成功無紅叉,右鍵選「測試」可視化輸入參數並執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved