包是壹個模式對象,它組合了各種邏輯上相關的類型、常量、變量、異常和子例程。包通常由兩部分組成:包描述和包體,但有時包體是不必要的。描述-規範是壹個應用程序接口;它聲明了可用的類型、變量、常量、異常、遊標和子程序,正文部分完整定義了遊標和子程序,實現了描述中的內容。
如下例所示,我們可以認為描述部分是可選接口,包是“黑盒”。我們可以在不改變接口(包描述)的情況下調試、增強或替換包體。
我們可以使用SQL*Plus中的CREATE PACKAGE語句來創建包。語法如下:
創建[或替換]包包名
[AUTHID {當前用戶|定義者}]
{IS | AS}
【PRAGMA連續_可重復使用;]
[集合類型定義...]
[記錄_類型_定義...]
[子類型_定義...]
[集合_聲明...]
[常量_聲明...]
[例外_聲明...]
[對象_聲明...]
[記錄_聲明...]
[變量_聲明...]
[光標_規格...]
[功能_規格...]
[程序_規格...]
[呼叫_規格...]
[PRAGMA限制_引用(斷言)...]
END[包名];
[創建[或替換]程序包體程序包名稱{IS | AS}
【PRAGMA連續_可重復使用;]
[集合類型定義...]
[記錄_類型_定義...]
[子類型_定義...]
[集合_聲明...]
[常量_聲明...]
[例外_聲明...]
[對象_聲明...]
[記錄_聲明...]
[變量_聲明...]
[光標_正文...]
[功能_規格...]
[程序_規格...]
[呼叫_規格...]
[開始
語句序列]
END[包名];]
描述部分中聲明的內容是公共的,對應用程序是可見的。我們必須包括所有其他內容(除了命名特殊函數的編譯指令;在聲明子例程之前,必須在函數描述之後聲明這樣的編譯指令。
包體中的內容是私有的,實現了描述部分定義的細節,對應用程序是不可見的。在包體聲明部分之後是可選的初始化部分,用於初始化包中的變量等。
AUTHID語句決定了所有的包子程序是按照定義者的權限(默認)還是調用方的權限執行,以及所涉及的schema對象是按照定義者的模式還是調用方的模式進行解析。
調用描述允許我們在Oracle數據字典中發布Java方法或外部C函數。調用指令通過將程序的名稱、參數類型和返回類型映射到它們的SQL對應物來發布程序。
1和PL/SQL程序包的示例
在下面的例子中,我們打包了壹個記錄類型、壹個遊標和兩個雇傭過程。請註意,過程hire_employee將數據庫序列empno_seq和函數SYSDATE分別插入到字段employee number和employment date中。
根據規格創建或替換包emp_actions
類型emprectyp被記錄(
emp_id INT,
實際工資
);
光標desc _薪資返回emprectyp
程序雇用_員工(
ename VARCHAR2,
作業變量2,
經理編號,
sal號,
通信號碼,
deptno號
);
程序fire_employee(emp_id號);
結束emp _ actions
創建或替換程序包體emp_actions AS - body
光標desc _薪金返回emprectyp為
選擇雇員,銷售
來自電磁脈沖
薩爾ORDER下令;
程序雇用_員工(
ename VARCHAR2,
作業變量2,
經理編號,
sal號,
通信號碼,
deptno號
)是
開始
插入emp
值(empno_seq。NEXTVAL,
ename,
工作,
經理,
系統日期,
薩爾,
通信,
deptno);
結束雇用_員工;
過程fire_employee(emp_id號)是
開始
從emp中刪除
其中empno = emp _ id
端火_員工;
結束emp _ actions
應用程序只能看到和訪問包描述部分中聲明的內容;包體的詳細實現是不可見和不可訪問的。因此,我們可以在不重新編譯調用程序的情況下修改包體(實現)。
二、PL/SQL包的優點
軟件包提供了幾個優點:模塊化、方便的應用程序設計、信息隱藏、附加功能和良好的性能。
模塊化
包允許我們將邏輯上相關的類型、常量、變量、異常和子例程放入壹個命名的PL/SQL模塊中。每個包都很好理解,包與包之間的界面簡單明了。這將有助於程序開發。
簡單編程
在設計應用程序時,我們首先需要確定的是包描述中的接口信息。我們可以在沒有包體的情況下編寫和編譯描述部分。那麽引用該包的存儲子例程也將被編譯。在完成整個應用程序之前,我們不需要完全實現包體部分。
信息隱蔽
有了包,我們可以指定哪些類型、常量、變量、異常和子例程是公共的(可見且可訪問)或私有的(隱藏且不可訪問)。例如,如果壹個包包含四個子程序,其中三個是公共的,壹個是私有的。包會隱藏私有子例程的實現,這樣如果實現內容發生變化,只有包本身(不是我們的應用程序)會受到影響。同樣,對用戶隱藏實現細節也可以確保包的完整性。
附加功能
在會話期間,打包的公共變量和遊標將始終存在。因此,它們可以由當前環境中的所有子例程共享。它們允許我們跨事務維護數據,而無需將數據保存在數據庫中。
良好的性能
當我們第壹次調用包子程序時,整個包將被加載到內存中。所以以後調用包裏的相關子程序時,就不需要再讀盤了。包可以阻止級聯依賴,從而避免不必要的編譯。例如,如果我們改變打包函數的實現,Oracle不需要重新編譯調用子例程,因為它們不依賴於包體。
第三,了解包裝說明
包描述包括壹個公共聲明。這些聲明的作用對於數據庫模式是局部的,對於包是全局的。因此,可以從應用程序和包中的任何地方訪問聲明的內容。下圖說明了包的範圍:
描述列出了包中應用程序可用的所有資源。例如,下面的聲明演示了壹個接受整數參數並返回整數結果的函數fac:
FUNCTION fac (n INTEGER)返回整數;-返回n!
這就是我們想要調用的函數的所有信息。我們不需要考慮它的實現細節(比如是用叠代還是遞歸)。
只有子程序和遊標有實現部分。因此,如果壹個描述只包含類型、常量、變量和異常的聲明和調用描述,那麽包體就是不必要的。這裏有壹個沒有包體的包:
將程序包trans_data創建為無主體程序包
類型timerec被記錄(
分鐘SMALLINT,
小時小提示
);
類型transrec被記錄(
類別VARCHAR2,
帳戶INT,
真實金額,
時間的時間
);
minimum_balance常數REAL:= 10.00;
number _ processed INT
資金不足例外;
結束trans _ data
包trans_data不需要主體,因為類型、常量、變量和異常沒有實現部分。這樣壹個包允許我們定義可以被子程序和數據庫觸發器使用的全局變量。
1,參考包內容
如果要引用類型、常量、變量、異常、子程序等。在包裝中聲明,您必須使用點標識:
包名.類型名
包名.項目名
程序包名稱.子程序名稱
程序包名稱.調用規格名稱
我們可以從數據庫觸發器、存儲的子例程、3GL(第三代編程語言)應用程序和各種Oracle工具中引用軟件包的內容。例如,我們可以從SQL*Plus調用過程hire_employee:
SQL & gt調用EMP _ actions . hire _ employee(' TATE ',' CLERK ',...);
在下面的示例中,我們可以從嵌入在Pro * C中的匿名PL/SQL塊中調用相同的過程。參數emp_name和job_title是主變量(即在主環境中聲明的變量)。
EXEC SQL執行
開始
EMP _ actions . hire _ employee(:EMP _ name,:job_title...);
抑制
我們不能直接或間接引用遠程包變量。例如,我們不能遠程調用以下過程,因為它引用了參數初始化子句中的包變量:
將包隨機創建為
種子號;
過程初始化(起始數:=種子,...);
同樣,我們不能引用包內的主變量。
希望對妳有幫助。