oracle資料庫物件-包PACKAGE用法

來源:互聯網
上載者:User


程式包是ORACLE PL/SQL的一個特性,它就像是一個容器或者說是一個命名空間,可以將各種邏輯相關的類型、常量、變數、異常和子程式結合在一起。為開發人員編寫大型複雜應用程式時,提供了一個良好的組織單元。

當定義好了程式包之後,應用程式就可以通過包來訪問各種不同的功能單元,而不用擔心過多零散的子程式導致程式碼的鬆散。

簡化應用設計、提高應用效能、實現資訊隱藏、子程式重載。

  1、Oracle的Package除 了把預存程序放到一堆兒以外還有沒有其他的作用(好處)?

  你不覺得把預存程序分門別類是很重要的麼,而且不同的package的預存程序可以重 名。

  用package不僅能把預存程序分門別類,而且在package裡可以定義公用的變數/類型,既方便了編程,又減少了伺服器的編譯開銷。

  2、如何把現有的預存程序加入到Package中?

  copy and pasty,不過調用的時候要帶包名了。

  3、除了使用SQL Plus,還有沒有什麼工具做Package?

  也有方便的第三方工具了,不過得自己找了。

  用第三方工具吧,比如sql navigator。

  4、使用SQL Plus編譯Package,是否每次都是編譯Package中所有的預存程序?

  是包也是一種命名pl/sql塊,和預存程序、函數一下,都是在資料庫啟動的時候就載入記憶體的。開銷的大小很難判斷,因為你不用包,但是要完成包的功能的話,還是要用PL/SQL來完成的,伺服器一樣有開銷。相對來說,用包少了SQL的文法分析、解釋過程,開銷還少一點。

  “過程一般都不超過20行”那我倒很少遇到。用不用子過程關鍵要看是不是能定義可重用的子過程,用子過程效率不會低。

  包的作用:包可以將任何出現在塊聲明的語句(過程,函數,遊標,遊標,類型,變數)放於包中,相當於一個容器.將聲明語句放入包中的好處是:使用者可以從其他PL/SQL塊中對其進行引用,因此包為PL/SQL提供了全程變數.

  包分為兩部分:包頭和包體.

  如何建立包?

  1)包頭:

  文法格式:

  CREATE OR REPLACE PACKAGEpackage_name /*包頭名稱*/

  IS|AS pl/sql_package_spec /*定義過程,函數以及傳回型別,變數,常量及資料類型定義*/

  定義包頭應當遵循以下原則:

  1)包元素位置可以任意安排.然而在聲明部分,對象必須在引用前進行聲明.

  2)包頭可以不對任何類型的元素進行說明.例如,包頭可以只帶過程和函數說明語句,而不聲明任何異常和類型.

  3)對過程和函數的任何聲明都必須只對子程式和其參數進行描述,不能有任何代碼的說明,代碼的實現只能在包體中出現.它不同於塊聲明,在塊聲明中,過程和函數的代碼可同時出現在聲明部分.

  2.包體:

  文法格式:

  CREATE OR REPLACE PACKAGE BODY package_name/*包名必須與包頭的包名一致*/

  IS | AS pl/sql_package_body /*遊標,函數,過程的具體定義*/

  包體是與包頭相互獨立的,包體只能在包頭完成編譯後才能進行編譯.包體中帶有包頭中描述的子程式的具體實現的程式碼片段.除此之外,包體還可以包括具有包體人全句屬性的附加聲明部分,但這些附加聲明對於包頭是不見的.

一個PL/SQL程式包包含如下兩個部分組成:

·包規範:主要是包的一些定義資訊,不包含具體的代碼實現部分。
·包體:包體是對包規範中聲明的子程式的實現部分,包體的內容對於外部應用程式來說是不可見的,包體就像是一個黑匣子一樣,是對包規範的實現。

1、包規範基本文法

CREATE [OR REPLACE] PACKAGE PACKAGE_NAME
{IS | AS}
  PACKAGE_SPECIFICATION
END PACKAGE_NAME;

例子:

--/
CREATE OR REPLACE PACKAGE pack_fun IS
--定義一個函數返回兩個數的和
FUNCTION fun_add(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定義一個函數返回兩個數的差
FUNCTION fun_sub(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定義一個預存程序顯示九九乘法表
PROCEDURE proc_1;
END;
/


2、包體基本文法

CREATE [OR REPLACE] PACKAGE BODY PACKAGE_NAME
{IS | AS}
  PACKAGE_BODY
END PACKAGE_NAME;

如果包體中的函數有一個修改了,就得全部重新編譯。

--/
CREATE OR REPLACE PACKAGE BODY pack_fun IS
FUNCTION fun_add(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
    tmp NUMBER;
  BEGIN
    tmp := num1 + num2;
    RETURN tmp;
  END fun_add;

FUNCTION fun_sub(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
    tmp NUMBER;
  BEGIN
    tmp := num1 - num2;
    RETURN tmp;
  END fun_sub;
 
PROCEDURE proc_1 IS
    M NUMBER := 0;
  BEGIN
    FOR I IN 1 .. 9 LOOP
      FOR J IN 1 .. I LOOP
        M := I * J;
        DBMS_OUTPUT.PUT(I || '*' || J || '=' || M || ' ');
      END LOOP;
      DBMS_OUTPUT.PUT_LINE(NULL);
    END LOOP;
  END proc_1;
 
END pack_fun;
/

3、調用包中的函數和預存程序

select pack_fun.fun_add(9,8) from dual;
select pack_fun.fun_sub(9,8) from dual;

--/
BEGIN
pack_fun.proc_1;
END;
/

聯繫我們

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