Oracle SQL 學(xué)習(xí)筆記22 - 包

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ī)則

  1. 立足于將來反復(fù)重用來構(gòu)建package
  2. 先定義 package specification铐炫,后定義 package body
  3. 僅在 package specification中定義公有結(jié)構(gòu)
  4. 若需要在一個(gè)session的多個(gè)事務(wù)中用到垒手,則可以將其置于 package body的聲明部分
  5. 對(duì) package specification 的改變需要重新編譯相關(guān)引用對(duì)象
  6. 盡可能少的在 package specification 進(jìn)行定義

使用package的優(yōu)勢(shì)

  1. 模塊化:封裝了相關(guān)結(jié)構(gòu)
  2. 易于維護(hù):將邏輯上相關(guān)的功能放到了一起
  3. 便于程序設(shè)計(jì):specification和body部分可以分別編碼和編譯
  4. 隱藏信息:
  • 只有在 package specification中聲明過的才對(duì)其他應(yīng)用是可見的和可訪問的
  • 在body內(nèi)的私有結(jié)構(gòu)被隱藏和不可見的
  • body中所有的代碼都被隱藏
  1. 增強(qiáng)功能:變量和cursor定義的持久化
  2. 提高性能:
  • 當(dāng)一次被調(diào)用的時(shí)候,整個(gè)package裝入內(nèi)存
  • 所有用戶調(diào)用同一個(gè)pacakge只占用一塊內(nèi)存
  • 程序依賴結(jié)構(gòu)簡(jiǎn)化了
  1. 重載:多個(gè)子程序可以使用同一個(gè)名稱
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倒信,一起剝皮案震驚了整個(gè)濱河市科贬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳖悠,老刑警劉巖榜掌,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乘综,居然都是意外死亡憎账,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門卡辰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胞皱,“玉大人邪意,你說我怎么就攤上這事》雌觯” “怎么了抄罕?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)于颖。 經(jīng)常有香客問我,道長(zhǎng)嚷兔,這世上最難降的妖魔是什么森渐? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮冒晰,結(jié)果婚禮上同衣,老公的妹妹穿的比我還像新娘。我一直安慰自己壶运,他們只是感情好耐齐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒋情,像睡著了一般埠况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棵癣,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天辕翰,我揣著相機(jī)與錄音,去河邊找鬼狈谊。 笑死喜命,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的河劝。 我是一名探鬼主播壁榕,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赎瞎!你這毒婦竟也來了牌里?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤煎娇,失蹤者是張志新(化名)和其女友劉穎二庵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缓呛,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催享,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哟绊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因妙。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攀涵,到底是詐尸還是另有隱情铣耘,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布以故,位于F島的核電站蜗细,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怒详。R本人自食惡果不足惜炉媒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昆烁。 院中可真熱鬧吊骤,春花似錦、人聲如沸静尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼠渺。三九已至鸭巴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拦盹,已是汗流浹背奕扣。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掌敬,地道東北人惯豆。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奔害,于是被迫代替她去往敵國(guó)和親楷兽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容