熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle的Package的作用及用法

2013-11-13 15:29:57  來源: Oracle 

  公司需求知識自學Oracle的Package的作用及用法

  簡化應用設計提高應用性能實現信息隱藏子程序重載

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

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

  用package不僅能把存儲過程分門別類而且在package裡可以定義公共的變量/類型既方便了編程又減少了服務器的編譯開銷

  如何把現有的存儲過程加入到Package中?

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

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

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

  用第三方工具吧比如sql navigator

  使用SQL Plus編譯Package是否每次都是編譯Package中所有的存儲過程?

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

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

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

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

  如何創建包?

  )包頭:

  語法格式:

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

  IS|AS pl/sql_package_spec /*定義過程函數以及返回類型變量常量及數據類型定義*/

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

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

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

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

  包體:

  語法格式:

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

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

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

  EG:定義一個包頭

















































































CREATE OR REPLACE PACKAGE select_table
IS
TYPE tab_ IS RECORD
 (
 itnum_ varchar()
 itnum_ varchar()
);
TYPE tab_ IS RECORD
(
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
);
TYPE tab_ IS RECORD
(
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
);
TYPE tab_ IS RECORD
(
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
itnum_ varchar()
);
TYPE tab_ IS RECORD
(
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
 itnum_ varchar()
itnum_ varchar()
itnum_ varchar()
);
TYPE cur_ IS REF CURSOR RETURNtab_;
TYPE cur_ IS REF CURSOR RETURNtab_;
TYPE cur_ IS REF CURSOR RETURNtab_;
TYPE cur_ IS REF CURSOR RETURNtab_;
TYPE cur_ IS REF CURSOR RETURNtab_;
END select_tab;
  
  
EG:
CREATE OR REPLACE PACKAGE test_package
IS
FUNCTION average
(cnum IN char)
RETURN NUMBER;
PRODURE student_grade
(CUR OUT select_tablecur_);CUR的數據類型是select_table包中cur_o
END test_package;
  
包體:
CREATE OR REPLACE PACKAGE BODY test_package
IS
/*函數實現開始*/
FUNCTION average                        
(cnum IN char)
RETURN NUMBER;
AS
avger NUMBER;
BEGIN
SELECT AVG(CJ) INTO avger FROM XS_KC WHERE KCH=cnum GROUP BYKCH;
RETURN(avger);
END average;
/*函數實現結束*/
/*過程實現開始*/
PRODURE student_grade
(CUR OUT select_tablecur_);
AS
OPEN CUR FOR
SELECT XSXH XSXMKCKCMXS_KCCJ
FROM XS XS_KCKC
WHERE XSXH =XS_KCXH AND XS_KCKCH=KCKCH;
END student_grade;

  /*過程實現結束*/

  END test_package;

  重載:包中的函數和過程可以重載

  以下條件不能重載:

  如果兩個子程序的參數僅在名稱和類型上不同這兩個程序不能重載

  PROCEDURE overloadME(p_theparameterIN number);

  PROCEDURE overloadME(p_theparameterOUT number);

  IN OUT為參數類型number為數據類型兩個過程僅在類型上不同時不能重載

  不能根據兩個函數的返回類型對其重載

  如:

  FUNCTION overloadMeETooRETURN DATE;

  FUNCTION overloadMeETooRETURN NUMER;

  重載子程序的參數的類族必須不同例如由於CHAR和VARCHAR屬性同一類族所以不能重載

  PROCEDURE overloadME(p_theparameterIN char);

  PROCEDURE overloadME(p_theparameterIN varchar);

  打包子程序也可以重載

  包的初始化

  當第一次調用打包子程序時該包將進行初始化也就是說將該包從硬盤中讀入到內存並啟用調用的子程序的編譯代碼這時系統為該包中定義的所有變量分配內存單元每個會話都有打其打開包變量的副本以確保執行同一個包子程序的兩個會話使用不同的內存單元

  在大多數情況下初始化代碼要在包第一次初始化時運行為了實現這一功能可以在包體中的所有對象之後加入一個初始化代碼

  語法格式:










CREATE OR REPLACE PACKAGE BODYpackage_name
IS|AS

BEGIN
Initialization_code;要運行的初始化代碼
  
END ;

  ORACLE 內置包

  DBMS_ALERT包:用於數據庫報警允許會話間通信

  DBMS_JOB:用於任務調度服務

  DBMS_LOB:用於處理大對象操作

  DBMS_PIPE包:用於數據庫管道允許會話間通信

  DBMS_SQL包:用於執行動態SQL

  UTL_FILE包:用於文件的輸入輸出

  除了UTL_FILE包存儲在服務器和客戶端外其他的包均存儲在服務器中


From:http://tw.wingwit.com/Article/program/Oracle/201311/16818.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.