package的構(gòu)成
PL/SQL package 概要
Package是PL/SQL的重要特性薄翅,它將邏輯上相關(guān)的組件組合在一起沙兰,包括PL/SQL類型,Variable翘魄,數(shù)據(jù)結(jié)構(gòu)鼎天,異常,存儲(chǔ)結(jié)構(gòu)和函數(shù)熟丸。有了package训措,Oracle可以一次將package定義的多個(gè)對(duì)象讀入內(nèi)存。
package 定義的結(jié)構(gòu)
package的定義包含兩部分:
- Specification:Public
-
Body:private
pac_stru.JPG
Package 組件的可視性
pac_vis.JPG
開發(fā) PL/SQL Packages
pac_dev.JPG
創(chuàng)建package specification 和 package body
創(chuàng)建Package說明部分
- 語法
CREATE [OR REPLACE] PACKAGE package_name IS|AS
public type and variable declarations
subprogram specifications
END [package_name];
其中光羞,OR REPLACE
選項(xiàng)用于替換已經(jīng)存在的package绩鸣。定義于package specification 的變量默認(rèn)被初始化為NULL。而定于于package specification 的常量對(duì)于所有對(duì)package有執(zhí)行權(quán)限的用戶來說纱兑,都是可見的呀闻。
- 舉例
CREATE OR REPLACE PACKAGE comm_pkg IS
std_comm NUMBER := 0.10; --initialized to 0.10
PROCEDURE reset_comm(new_comm NUMBER);
END comm_pkg;
創(chuàng)建Package Body
- 語法
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
private type and variable declarations
subprogram bodies
[BEGIN initialization statements]
END [package name];
定義于package body變量都是是私有的,在package body之外不可見潜慎。任何私有結(jié)構(gòu)必須先定義后引用捡多。公有結(jié)構(gòu)對(duì)package body是可見的。
- 舉例
CREATE OR REPLACE PACKAGE BODY comm_pkg IS
FUNCTION validate(comm NUMBER) RETURN BOOLEAN IS
max_comm employees.commission_pct%TYPE;
BEGIN
SELECT MAX(commission_pct) INTO max_comm
FROM employees;
RETURN (comm BETWEEN 0.0 AND max_comm);
END validate
PROCEDURE reset_comm(new_comm NUMBER) IS
BEGIN
IF validate(new_comm) THEN
std_comm := new_comm ; -- reset public var
ELSE RAISE_APPLICATION_ERROR(-20120, 'Bad Commission');
END IF;
END reset_comm;
END comm_pkg;
package的使用
調(diào)用package子程序
CREATE OR REPLACE BODY comm_pkg IS...
PROCEDURE reset_comm(new_comm NUMBER) IS
BEGIN
IF validate(new_comm) THEN
std_comm := new_comm;
ELSE...
END IF
END reset_comm;
END comm_pkg;
EXECUTE comm_pkg.reset_comm(0.15)
EXECUTE scott.comm_pkg.reset_comm(0.15)
創(chuàng)建和使用無包體Package
CREATE OF REPLACE PACKAGE global_consts IS
mile_2_kilo CONSTANT NUMBER := 1.6093;
kilo_2_milo CONSTANT NUMBER := 0.6214;
yard_2_meter CONSTANT NUMBER := 0.9144;
meter_2_yard CONSTANT NUMBER := 1.0936;
END global_consts;
BEGIN
DBMS_OUTPUT.PUT_LINE('20 miles = ' || 20
* global_consts.mile_2_kilo || ' km');
END
CREATE FUNCTION mtr2yrd(m NUMBER) RETURN IS
BEGIN
RETURN (m * global_consts.meter_2_yard);
END mtr2yrd;
/
EXECUTE DBMS_OUTPUT.PUT_LINE(mtr2yrd(1));
刪除Package
- 刪除包和體
DROP PACKAGE package_name;
- 僅僅刪除包體
DROP PACKAGE BODY package_name;
在數(shù)據(jù)字典中查看包的信息
SELECT text
FROM user_source
WHERE name = 'COMM_PKG' AND type = 'PACKAGE';
SELECT text
FROM user_source
WHERE name = 'COMM_PKG' AND type = 'PACKAGE BODY';
創(chuàng)建包的一般規(guī)則
- 立足于將來反復(fù)重用來構(gòu)建package
- 先定義 package specification铐炫,后定義 package body
- 僅在 package specification中定義公有結(jié)構(gòu)
- 若需要在一個(gè)session的多個(gè)事務(wù)中用到垒手,則可以將其置于 package body的聲明部分
- 對(duì) package specification 的改變需要重新編譯相關(guān)引用對(duì)象
- 盡可能少的在 package specification 進(jìn)行定義
使用package的優(yōu)勢(shì)
- 模塊化:封裝了相關(guān)結(jié)構(gòu)
- 易于維護(hù):將邏輯上相關(guān)的功能放到了一起
- 便于程序設(shè)計(jì):specification和body部分可以分別編碼和編譯
- 隱藏信息:
- 只有在 package specification中聲明過的才對(duì)其他應(yīng)用是可見的和可訪問的
- 在body內(nèi)的私有結(jié)構(gòu)被隱藏和不可見的
- body中所有的代碼都被隱藏
- 增強(qiáng)功能:變量和cursor定義的持久化
- 提高性能:
- 當(dāng)一次被調(diào)用的時(shí)候,整個(gè)package裝入內(nèi)存
- 所有用戶調(diào)用同一個(gè)pacakge只占用一塊內(nèi)存
- 程序依賴結(jié)構(gòu)簡(jiǎn)化了
- 重載:多個(gè)子程序可以使用同一個(gè)名稱