ORACLE PL/SQL包(package)學習筆記

來源:互聯網
上載者:User

包由包規範和包體兩部分組成。

 

1、包規範(Package Specification)

包規範,也叫做包頭,包含了有關包的內容的資訊。但是,它不包含任何過程的代碼。

建立包頭的文法一般如下

 

CREATE [OR REPLACE] PACKAGE package_name {IS | AS}

Procedure_name | function_name | variable_declaration | type_definition | exception_declaration | cursor_declaration

END [package_name];

 

聲明包頭還要遵循一些文法規則,如下:

  • 包組件可以以任意次序出現。但是,對象必須在被引用之前進行聲明。
  • 所有類型的組件都沒有必要都被使用。例如,包可以僅包含過程和函數規範,而沒有聲明異常處理或類型。
  • 對於過程和函數的所有聲明都必須是前向聲明。

 

2、包主體(Package Body)

包主體和包頭儲存在不同的資料字典中。如果沒有對包頭進行成功的編譯,就不可能對包主體編譯成功。主體中包含了在包頭中前向子程式聲明相應的代碼。

 

包主體是可選的。如果包頭不包含任何過程或函數,那麼包主體可以沒有。這個技術對於聲明全域變數是很有用的,因為包中的所有對象在包的外面是可見的。

 

包頭中的所有前向聲明必須在包主體中被更新。過程或函數的規範在包頭和包主體中必須是相同的。這個規範包括子程式的名字、參數的名字以及參數的模式。

 

3、包和範圍

在包頭中定義的任何對象都有一定的範圍,在包以外通過使用包名稱限定仍然可以使用這些對象。例如,可以像下面PL/SQL塊那樣調用InventoryOps.DeleteISBN過程。

 

BEGIN

InventoryOps.DeleteISBN(‘78824389’);

END;

 

包過程的調用與單獨的程序呼叫相同,唯一的區別就是在包過程的前面添加了包名稱首碼。包過程可以帶有預設的參數,可以使用位置標記法或者名稱標記法調用它們,就像單獨的預存程序一樣。

 

包頭中的對象在包主體中可以直接使用,不需要附帶包名首碼。

 

4、包子程式的重載

在包中,過程和函數是可以重載的。這也就意味著可以讓多個過程或函數共用同一個名稱,但是帶有不同的參數。這是一個非常有用的功能特性,因為它讓同一個操作可以執行在不同類型的對象上。

 

下面樣本示範了包子程式的重載

 

CREATE OR REPLACE PACKAGE InventoryOps AS</p><p>…</p><p> -- Returns an array containing the books with the specified status.</p><p> PROCEDURE StatusList(p_Status IN inventory.status%TYPE,</p><p> p_Books OUT t_ISBNTable,</p><p> p_NumBooks OUT BINARY_INTEGER);</p><p> TYPE c_ISBNCur IS REF CURSOR;</p><p> -- Returns an opened cursor containing the books with the specified status.</p><p> PROCEDURE StatusList(p_Status IN inventory.status%TYPE, --重載</p><p> p_BookCur OUT c_ISBNCur);</p><p>END InventoryOps;</p><p>/</p><p>CREATE OR REPLACE PACKAGE BODY InventoryOps AS</p><p>…</p><p>-- Returns an array containing the books with the specified status.</p><p> PROCEDURE StatusList(p_Status IN inventory.status%TYPE,</p><p> p_Books OUT t_ISBNTable,</p><p> p_NumBooks OUT BINARY_INTEGER) IS</p><p> v_ISBN inventory.isbn%TYPE;</p><p> CURSOR c_Books IS</p><p> SELECT isbn</p><p> FROM inventory</p><p> WHERE status = p_Status;</p><p> BEGIN</p><p> ValidateStatus(p_Status);</p><p> /* p_NumBooks will be the array index. It will start at</p><p> * 0, and be incremented each time through the fetch loop.</p><p> * At the end of the loop, it will have the number of rows</p><p> * fetched, and therefore the number of rows returned in</p><p> * p_Books. */</p><p> p_NumBooks := 0;</p><p> OPEN c_Books;</p><p> LOOP</p><p> FETCH c_Books INTO v_ISBN;</p><p> EXIT WHEN c_Books%NOTFOUND;</p><p> p_NumBooks := p_NumBooks + 1; </p><p> p_Books(p_NumBooks) := v_ISBN;</p><p> END LOOP;</p><p> CLOSE c_Books;</p><p> END StatusList;</p><p> -- Returns an opened cursor containing the books with the specified status.</p><p> PROCEDURE StatusList(p_Status IN inventory.status%TYPE,</p><p> p_BookCur OUT c_ISBNCur) IS</p><p> BEGIN</p><p> ValidateStatus(p_Status);</p><p> OPEN p_BookCur FOR </p><p> SELECT isbn</p><p> FROM inventory</p><p> WHERE status = p_Status;</p><p> END StatusList;</p><p>END InventoryOps;</p><p>/</p><p>  

 

當需要不同型別參數執行同一操作時,重載這種技術就非常有用。但是,重載也有一些限制:

 

  • 如果兩個子程式只在參數的名稱和模式上不同的時候,就不能重載這兩個子程式。
  • 如果兩個函數只在傳回型別上存在不同的時候,就不能重載這兩個函數。
  • 重載函數的參數必須分別屬於不同的類型系列—不能在同一類型系列的參數上使用重載。

 

 

5、包的初始化

首次調用包子程式,或引用了包的任意變數或資料類型的時候,包就被執行個體化。執行個體化就意味著系統已將包從磁碟讀取到記憶體中,被調用子程式的已編譯代碼也正在運行。此時,將為包中定義的所有變數分配記憶體。每一個會話都有包變數的一份副本,這保證了執行同一包的同一子程式的兩個會話使用的是不同的記憶體位置。

 

在大多數情況下,某個會話中的包一旦被執行個體化,都需要立即運行初始化代碼。這可以通過在包主體中添加一個初始化部分來實現。初始化部分的位置是在其他所有對象以後,初始化的文法如下:

 

CREATE OR REPLACE PACKAGE BODY package_name {IS | AS}

BEGIN

Initialization_code;

END [pckage_name];

 

 

6、預設參數

當從過程性的語句中調用函數的時候,如果需要的話,你可以為形式參數設定預設值。但是當從SQL語句中調用函數的時候,必須為所有的參數指定預設值。而且,只能使用位置標識法而不是帶名標識法指定預設值。下面對於FullName的調用就是非法的。

 

SELECT FullName(p_StudentID=>10000) FROM dual;

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.