包包package是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一課件_第1頁
包包package是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一課件_第2頁
包包package是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一課件_第3頁
包包package是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一課件_第4頁
包包package是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第三章:包

包(package)是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一起的PL/SQL結(jié)構(gòu)。包包含了兩個(gè)分離的部件------包說明(specification)和包主體(body)。每個(gè)部件都單獨(dú)被存儲(chǔ)在數(shù)據(jù)字典中。包只能存儲(chǔ)在數(shù)據(jù)庫中,不能是本地的。除了可以將相關(guān)對(duì)象作為一組存在一起以外,包也是十分有用的,因?yàn)樗鼈冊(cè)谝蕾囆苑矫娴南拗剖潜容^小的。也有許多性能上的優(yōu)點(diǎn)。

1.包的組成

將相關(guān)的若干程序結(jié)構(gòu)組織到一塊,用一個(gè)包來標(biāo)識(shí)這個(gè)集合。

程序單元描述____________________________________________________過程(procedure)帶有參數(shù)的程序函數(shù)(Function)帶有參數(shù)的程序,該程序只返回一個(gè)值變量(Variable)用于存儲(chǔ)變化值的存儲(chǔ)單元游標(biāo)(Cursor)指向一個(gè)SQL語句的指針常量(Constant)指向常數(shù)的指針異常情況(Exception)標(biāo)志一個(gè)異常情況包說明是操作接口,對(duì)應(yīng)用可見;包主體是黑盒,對(duì)應(yīng)用隱藏實(shí)現(xiàn)細(xì)節(jié)包由說明部分和包主體兩部分組成,在包的說明部分說明的元素(過程、函數(shù)等)是公共元素,只在包主體中說明的元素是私有元素。

元素的性質(zhì)描述在包中的位置

公共的(public)在整個(gè)應(yīng)用的全過包的說明部分說明,程均有效并在包主體中具體定義它私有的(private)對(duì)包以外的過程和在包主體部分說明函數(shù)是不可見的和定義局部的只在一個(gè)過程或函在所屬過程或函數(shù)的數(shù)內(nèi)部可用內(nèi)部說明和定義

注釋:

●程序(過程、函數(shù))可以是公共的或私有的?!駱?biāo)識(shí)符(變量、游標(biāo)、常量、異常處理)可以是公共、私有或局部的。

在包說明部分說明的所有對(duì)象在包的外面都是可用的并且是可見的。只需指定該包的名字就可以訪問該對(duì)象了。

2.開發(fā)包

按下述步驟開發(fā)一個(gè)包,注意這和過程的開發(fā)相似。

●在一個(gè)文本文件中寫入CREATEPACKAGE語句以說明一個(gè)包?!裼肅REATEPACKAGEBODY語句創(chuàng)建包體。

●在SQL*plus或SVRMGR中運(yùn)行這兩個(gè)文本文件,以將包的源代碼編譯成編譯代碼(P-Code),并將這兩種代碼存人數(shù)據(jù)庫中?!駨腛RACLE環(huán)境,或者從一個(gè)獨(dú)立的函數(shù)或過程調(diào)用一個(gè)包內(nèi)的公共元素。注釋:

●也可將CREATEPACKAGE語句和CREATEPACKAGEBODY語句寫入同一個(gè)文本文件中?!飫?chuàng)建包說明的語法:

CREATE[ORREPLACE]PACKAGE[模式名.]包名{IS|AS}PL/SQL塊包說明

例1:

CREATEORREPLACEPACKAGEemp_actionsASPROCEDUREhire_employee(enameCHAR...);PROCEDUREfire_employee(emp_idNUMBER...);FUNCTION…ENDemp_actions;/例2:制作一個(gè)包說明

生成一個(gè)管理雇員薪水的包,其中包括一個(gè)為雇員加薪的過程,并且在包中還有一個(gè)記錄所有雇員薪水增量的全局變量。

CREATEPACKAGEsal_packageISPROCEDUREraise_sal(v_empnoemp.empno%TYPE,v_sal_incrementemp.sal%TYPE);v_delta_salemp.sal%TYPE;ENDsal_packages;

★創(chuàng)建包主體的語法:

CREATE[ORREPLACE]PACKAGEBODY[模式名.]包名{IS|AS}PL/SQL包說明

例:

CREATEORREPLACEPACKAGEBODYemp_actionsASPROCEDUREhire_employee(enameCHAR...)BEGIN過程語句ENDhire_employee;PROCEDUREfire_employee(emp_idNUMBER...)BEGIN過程語句ENDhire_employee;ENDemp_actions;/在創(chuàng)建公共過程時(shí)使用私有過程可以使代碼模塊化和清晰化??梢栽诎黧w的開始定義一個(gè)私有過程,以初始化所有全局變量。

例子:制作一個(gè)包體。

創(chuàng)建一個(gè)私有函數(shù)以簡化過程RAISE_SAL的代碼,同時(shí)創(chuàng)建一個(gè)用來初始化全局變量V_DELTA_SAL的過程。CREATEPACKAGEBODYsal_paCkageIS

FUNCTIONget_sal(v_empnoemp.empno%type)ReturnnumberIsV_empsalemp.sal%type:=0;BeginSelectsalIntov_empsalFromempWhereempno=v_empno;Return(v_empsal);End;

PROCEDUREraise_sal(v_empnoemp.empno%TYPE,v_sal_incrementemp.sal%TYPE)ISv_old_salemp.sal%TYPE;BEGINv_old_sal:=get_sal(v_empno);UPDATEempSETsal=sal十v_sal_incrementWHEREempno=v_empno;COMMITWORK;v_delta_sal:=v_delta_sal十v_sal_incrernent;ENDraise_sal;

ENDsal_package;/注釋:

●包中NUMBER型變量缺省初始化值為0,VARCHAR2型變量缺省初始化值為空。

注意:包說明部分是必需的,而包主體部分是可選的。過程和函數(shù)的說明在包說明和包主體部分應(yīng)該是相同的。包括過程、函數(shù)的名字、參數(shù)的名字以及參數(shù)的模式。

3.包的管理

包的存儲(chǔ)和一個(gè)單獨(dú)的過程存儲(chǔ)一樣。

內(nèi)容命令創(chuàng)建一個(gè)新的包說明信息CREATEPACKAGE創(chuàng)建一個(gè)新的包主體CREATEPACKAGEBODY修改一個(gè)已有的包的說明CREATEORREPLACEPACKAGE修改一個(gè)已有的包主體CREATEORREPLACEPACKAGEBODY刪除包的說明和包主體DROPPACKAGE刪除包主體DROPPACKAGEBODY注釋:

●當(dāng)包的說明被刪除或修改時(shí),一般要求把包主體也刪除或做相應(yīng)修改?!癞?dāng)刪除或修改包主體時(shí),可以不刪除或修改包的說明。

在管理包時(shí),整個(gè)包(包括其中所有的元素)是作為一個(gè)邏輯單元進(jìn)行管理的,其管理命令和方法都與管理單個(gè)過程相同。

任務(wù)包獨(dú)立過程文檔記錄在數(shù)據(jù)字典視圖在數(shù)據(jù)字典視圖USER_SOURCE中USER_SOURCE中檢查編譯錯(cuò)誤在數(shù)據(jù)字典視圖在數(shù)據(jù)字典視圖USER_ERRORS中USER_ERRORS中開發(fā)方法利用SQL*Plus利用SQL*Plus批文件批文件開發(fā)權(quán)限需要CREATE需要CREATEPROCEDUREPROCEDURE系統(tǒng)權(quán)限系統(tǒng)權(quán)限

使用權(quán)限需要對(duì)包有EXECUTE需要對(duì)過程有EXECUTE實(shí)體特權(quán)實(shí)體特權(quán)注釋:

●用DBMS_OUTPUT系統(tǒng)包中的過程來調(diào)試包中的過程。4.包的調(diào)用

●從另一個(gè)存儲(chǔ)子程序調(diào)用emp_actions.hire_employee(name…);●從ORACLE工具中調(diào)用SQL>EXECUTEemp_actions.hire_employ(…);●

遠(yuǎn)程存?。喊?過程名@DB鏈路名例子:調(diào)用一個(gè)公共過程。給7654號(hào)雇員加薪$100。

SQL>EXECUTEsal_package.raise_sal(7654,100);

注釋:●利用包名可以使一個(gè)用戶的兩個(gè)不同過程有相同的名字。在一個(gè)用戶對(duì)話中可以從任何獨(dú)立過程中引用包中的公共變量、游標(biāo)、常量和異常情況。

例子:調(diào)用包中的變量。當(dāng)某部門整個(gè)薪水的變化超過予算的,發(fā)一條警告信息。

CREATEPROCEDUREwarn_sal(v_sal_budgetINemp.sal%TYPE)ISBEGINIFsal_package.v_delta_sal>v_sal_budgetTHENRAISE_APPLICATION_ERROR(-20400,

‘Salarybudgetexceeded.’);ENDIF;ENDwarn_sal;

注釋:●引用包中的變量時(shí),在它前面加上包的名字。5.包的依賴性

與獨(dú)立過程一樣,盡管包也有自動(dòng)管理本地依賴性和遠(yuǎn)程依賴性的機(jī)制,但仍建議用戶對(duì)那些無效的包進(jìn)行手動(dòng)地重新編譯。任務(wù)包獨(dú)立過程記錄文檔在數(shù)據(jù)字典的在數(shù)據(jù)字典的DEPENDENCIESDEPENDENCIES視圖里視圖里

手動(dòng)重新編譯用ALTERPACKAGE用ALTER命令PROCEDURE命令

自動(dòng)重新編譯取決地本地、遠(yuǎn)程依取決于本地、遠(yuǎn)程依賴性的自動(dòng)管理機(jī)制賴的自動(dòng)管理機(jī)制★語法——重新編譯包體和包說明的定義

ALTERPACKAGE—packagename—COMPILEPACKAGE

★語法——重新編譯包體

ALTERPACKAGE—packagename—COMPILEPACKAGEBODY

其中:packagename指包的名字注釋:

●當(dāng)重新編譯包說明的定義時(shí),必須對(duì)包體重新編譯?!癞?dāng)只重新編譯包體時(shí),不一定要重編譯包說明的定義?!?/p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論