【Oracle_Package】Oracle的Package的做用及用法 【20140612】

Oracle的Package的做用

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

一、Oracle的Package除 了把存儲過程放到一堆兒之外還有沒有其餘的做用(好處)?

你不以爲把存儲過程分門別類是很重要的麼,並且不一樣的package的存儲過程能夠重 名。
用package不只能把存儲過程分門別類,並且在package裏能夠定義公共的變量/類型,既方便了編程,又減小了服務器的編譯開銷。

二、如何把現有的存儲過程加入到Package中?
copy and pasty,不過調用的時候要帶包名了。

三、除了使用SQL Plus,還有沒有什麼工具作Package?
也有方便的第三方工具了,不過得本身找了。
用第三方工具吧,好比sql navigator。www.quest.com

四、使用SQL Plus編譯Package,是否每次都是編譯Package中全部的存儲過程?



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

「過程通常都不超過20行」那我倒不多遇到。用不用子過程關鍵要看是否是能定義可重用的子過程,用子過程效率不會低。

sql

包的做用:包能夠將任何出如今塊聲明的語句(過程,函數,遊標,遊標,類型,變量)放於包中,至關於一個容器.將聲明語句放入包中的好處是:用戶能夠從其餘PL/SQL塊中對其進行引用,所以包爲PL/SQL提供了全程變量.數據庫

包分爲兩部分:包頭和包體.編程

如何建立包?服務器

1)包頭:函數

  語法格式:工具

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

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

 定義包頭應當遵循如下原則:設計

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

 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.重載子程序的參數的類族必須不一樣,例如,因爲CHARVARCHAR2屬性同一類族,因此不能重載 .

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包存儲在服務器和客戶端外,其餘的包均存儲在服務器中

相關文章
相關標籤/搜索