Oracle的Package的作用

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

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 /遊標,函數,過程的具體定義/
包體是與包頭相互獨立的,包體只能在包頭完成編譯後才能進行編譯.包體中帶有包頭中描述的子程序的具體實現的代碼段.除此之外,包體還可以包括具有包體人全句屬性的附加聲明部分,但這些附加聲明對於包頭是不見的.
EG:定義一個包頭

CREATE OR REPLACE PACKAGE select_table
IS
TYPE tab_02 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1)
);
TYPE tab_03 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1)
);
TYPE tab_04 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1)
);
TYPE tab_05 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1),
itnum_5 varchar2(1)
);
TYPE tab_06 IS RECORD
(
itnum_1 varchar2(1),
itnum_2 varchar2(1),
itnum_3 varchar2(1),
itnum_4 varchar2(1),
itnum_5 varchar2(1),
itnum_6 varchar2(1)
);
TYPE cur_02 IS REF CURSOR RETURNtab_02;
TYPE cur_03 IS REF CURSOR RETURNtab_03;
TYPE cur_04 IS REF CURSOR RETURNtab_04;
TYPE cur_05 IS REF CURSOR RETURNtab_05;
TYPE cur_06 IS REF CURSOR RETURNtab_06;
END select_tab;

EG:
CREATE OR REPLACE PACKAGE test_package
IS
FUNCTION average
(cnum IN char)
RETURN NUMBER;
PRODURE student_grade
(CUR OUT select_table.cur_04);–CUR的數據類型是select_table包中cur_o4
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_table.cur_04);
AS
OPEN CUR FOR
SELECT XS.XH ,XS.XM,KC.KCM,XS_KC.CJ
FROM XS ,XS_KC,KC
WHERE XS.XH =XS_KC.XH AND XS_KC.KCH=KC.KCH;
END student_grade;
/過程實現結束/
END test_package;
重載:包中的函數和過程可以重載
以下條件不能重載:
1.如果兩個子程序的參數僅在名稱和類型上不同,這兩個程序不能重載.
PROCEDURE overloadME(p_theparameterIN number);
PROCEDURE overloadME(p_theparameterOUT number);
IN ,OUT爲參數類型,number爲數據類型.兩個過程僅在類型上不同時不能重載.
2.不能根據兩個函數的返回類型對其重載
如:
FUNCTION overloadMeETooRETURN DATE;
FUNCTION overloadMeETooRETURN NUMER;
3.重載子程序的參數的類族必須不同,例如,由於CHAR和VARCHAR2屬性同一類族,所以不能重載 .
PROCEDURE overloadME(p_theparameterIN char);
PROCEDURE overloadME(p_theparameterIN varchar2);
4.打包子程序也可以重載

5.包的初始化.
當第一次調用打包子程序時,該包將進行初始化.也就是說,將該包從硬盤中讀入到內存,並啓用調用的子程序的編譯代碼.這時,系統爲該包中定義的所有變量分配內存單元.每個會話都有打其打開包變量的副本,以確保執行同一個包子程序的兩個會話使用不同的內存單元.
在大多數情況下,初始化代碼要在包第一次初始化時運行.爲了實現這一功能,可以在包體中的所有對象之後加入一個初始化代碼 .
語法格式:
CREATE OR REPLACE PACKAGE BODYpackage_name
IS|AS
…………
BEGIN
Initialization_code;–要運行的初始化代碼

END ;

ORACLE 內置包
1.DBMS_ALERT包:用於數據庫報警,允許會話間通信
2.DBMS_JOB:用於任務調度服務
3.DBMS_LOB:用於處理大對象操作
4.DBMS_PIPE包:用於數據庫管道,允許會話間通信
5.DBMS_SQL包:用於執行動態SQL
6.UTL_FILE包:用於文件的輸入輸出
除了UTL_FILE包存儲在服務器和客戶端外,其他的包均存儲在服務器中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章