Oracle 中包(Package)

來源:互聯網
上載者:User

標籤:

一、 什麼要使用包?

       在一個大型項目中,可能有很多模組,而每個模組又有自己的過程、函數等。而這些過程、函數預設是放在一起的(如在PL/SQL中,過程預設都是放在一起 的,即Procedures中),這些非常不方便查詢和維護,甚至會發生誤刪除的事件。

PL/SQL為了滿足程式模組化的需要,引入了包的構造。通過使用包就可以分類管理過程和函數等。

(1)包是一種資料庫物件,相當於一個容器。將邏輯上相關的過程、函數、變數、常量和遊標組合成一個更大的單位。使用者可以從其他 PL/SQL 塊中對其進行引用

(2)包類似於C++和JAVA語言中的類,其中變數相當於類中的成員變數,過程和函數相當於類方法。把相關的模組歸類成為包,可使開發人員利用物件導向的方法進行開發,具有物件導向程式設計語言的特點,

(4)PL/SQL的包具有資訊隱蔽性(information hiding),僅在演算法和資料結構設計有關層可見。可將過程說明和過程體組成一個程式單位。也可將過程說明與它的過程體分開。也可在包中定義過程,而該過程在包說明中沒有定義過程說明,這樣已定義流程僅在包內使用。

(5)在PL/SQL程式設計中,使用包不僅可以使程式設計模組化,對外隱藏包內所使用的資訊(通過使用私用變數),而寫可以提高程式的執行效率。因為,當程式首次調用包內函數或過程時,ORACLE將整個包調入記憶體,當再次訪問包內元素時,ORACLE直接從記憶體中讀取,而不需要進行磁碟I/O操作,從而使程式執行效率得到提高。

二、包結構

一個包由兩個分開的部分組成:包規範包體

2.1包定義(PACKAGE)

(1) 包定義(PACKAGE):包定義部分是為應用程式的介面,聲明包內資料類型、變數、常量、遊標、子程式和異常錯誤處理等元素,這些元素為包的公有元素。

CREATE [OR REPLACE] PACKAGE package_name   {IS | AS}   [公有資料類型定義]   [公有遊標聲明]   [公有變數、常量聲明]   [公有子程式聲明]END   [package_name];
2.2包主體(PACKAGE BODY)

包主體(PACKAGE BODY):包主體則是包定義部分的具體實現,它定義了包定義部分所聲明的遊標和子程式,在包主體中還可以聲明包的私人元素。如果在包主體中的遊標或子程式並沒有在包頭中定義,那麼這個遊標或子程式是私人的。

CREATE [OR REPLACE] PACKAGE BODY package_name{IS | AS}                   [私人資料類型定義]                   [私人變數、常量聲明]                   [私人子程式聲明和定義]                   [公有子程式定義]BEGIN                   PL/SQL 陳述式END [package_name];

與類相同,包中的程式元素也分為公用元素和私用元素兩種,這兩種元素的區別是他們允許訪問的程式範圍不同,即它們的範圍不同。公用元素不僅可以被包中的函數、過程所調用,也可以被包外的PL/SQL程式訪問,而私人元素只能被包內的函數和過程式所訪問。

包定義和包主體分開編譯,並作為兩部分分開的對象存放在資料庫字典中。包定義一定要在包主體前面編譯,包主體可以沒有,但包定義一定要有) 包的名稱和包體的名稱要保持一致

三、包舉例定義包規範
CREATE OR REPLACE package p_stuas    --定義結構體    type re_stu is record(        rname student.name%type,        rage  student.age%type    );    --定義遊標    type c_stu is ref cursor;    --定義函數    function numAdd(num1 number,num2 number)return number;    --定義過程    procedure GetStuList(cid in varchar2,c_st out c_stu); end;

說明 type c_stu is ref cursor;

type c_stu:定義類型變數

is ref cursor:相當於資料類型,不過是引用遊標的資料類型。

這種變數通常用於預存程序和函數返回結果集時使用,因為PL/SQL不允許預存程序或函數直接返回結果集,但可以傳回型別變數,於是引用遊標的類型變數作為輸出參數或傳回值就應運而生了。

定義包體:
CREATE OR REPLACE package body p_stuas    --遊標和結構體,包規範中已聲明,包體中不用再聲明,直接使用。        --實現方法       function numAdd(num1 number,num2 number)return number    as        num number;    begin        num:=num1+num2;        return num;    end;        --實現過程    procedure GetStuList(cid varchar2,c_st out c_stu)    as        r_stu re_stu; --直接使用包規範中的結構    begin        open c_st for select name,age from student where classid=cid;       -- 如果已經在過程中遍曆了遊標,在使用這個過程的塊中,將沒有值。       -- loop       --     fetch c_st into r_stu;         --     exit when c_st%notfound;       --     dbms_output.put_line(‘姓名=‘||r_stu.rname);       -- end loop;    end;end;
調用包
declare    c_stu p_stu.c_stu;   --定義包中遊標變數    r_stu p_stu.re_stu;  --定義包中結構體變數    num number;begin    --使用及遍曆包中過程返回的結果集    p_stu.GetStuList(‘5‘,c_stu);    loop        fetch c_stu into r_stu;        exit when c_stu%notfound;        dbms_output.put_line(‘姓名=‘||r_stu.rname);    end loop;        --使用包中的方法    select p_stu.numAdd(5,6) into num from dual;    dbms_output.put_line(‘Num=‘||num);end;
參考

Oracle 包(Package)

第七章 程式包的建立和應用

Oracle 中包(Package)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.