Oracle數(shù)據(jù)庫(kù)管理.ppt
《Oracle數(shù)據(jù)庫(kù)管理.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《Oracle數(shù)據(jù)庫(kù)管理.ppt(69頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
Oracle數(shù)據(jù)庫(kù)管理,本章學(xué)習(xí)目標(biāo)Oracle數(shù)據(jù)庫(kù)是一個(gè)復(fù)雜的大型關(guān)系數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)管理的內(nèi)容很多,包括管理實(shí)例、創(chuàng)建數(shù)據(jù)庫(kù)、管理控制文件、日志文件、表空間和數(shù)據(jù)文件、管理臨時(shí)段、數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)完整性、用戶(hù),使用管理工具等。,第五章Oracle數(shù)據(jù)庫(kù)管理,本章內(nèi)容安排,5.1Oracle數(shù)據(jù)庫(kù)管理簡(jiǎn)介,5.2創(chuàng)建、啟動(dòng)和關(guān)閉Oracle數(shù)據(jù)庫(kù),4.3存儲(chǔ)過(guò)程,4.4觸發(fā)器,4.5游標(biāo),4.6包,4.7函數(shù),,4.1PL/SQL簡(jiǎn)介,4.1.1PL/SQL特點(diǎn),4.1.2開(kāi)發(fā)及運(yùn)行環(huán)境,1.PL/SQL的優(yōu)點(diǎn)(1)PL/SQL是一種高性能的基于事務(wù)處理的語(yǔ)言,能運(yùn)行在任何Oracle環(huán)境中,支持所有數(shù)據(jù)處理命令。通過(guò)使用PL/SQL程序單元處理SQL的數(shù)據(jù)定義和數(shù)據(jù)控制元素。(2)PL/SQL支持所有SQL數(shù)據(jù)類(lèi)型和所有SQL函數(shù),同時(shí)支持所有Oracle對(duì)象類(lèi)型。(3)PL/SQL塊可以被命名和存儲(chǔ)在Oracle服務(wù)器中,同時(shí)也能被其他的PL/SQL程序或SQL命令調(diào)用,任何客戶(hù)/服務(wù)器工具都能訪問(wèn)PL/SQL程序,具有很好的可重用性。(4)可以使用Oracle數(shù)據(jù)工具管理存儲(chǔ)在服務(wù)器中的PL/SQL程序的安全性??梢允跈?quán)或撤銷(xiāo)數(shù)據(jù)庫(kù)其他用戶(hù)訪問(wèn)PL/SQL程序的能力。(5)PL/SQL代碼可以使用任何ASCII文本編輯器編寫(xiě),所以對(duì)任何Oracle能夠運(yùn)行的操作系統(tǒng)都是非常便利的。,4.1.1PL/SQL特點(diǎn),2.PL/SQL的缺點(diǎn)對(duì)于SQL,Oracle必須在同一時(shí)間處理每一條SQL語(yǔ)句,在網(wǎng)絡(luò)環(huán)境下這就意味作每一個(gè)獨(dú)立的調(diào)用都必須被oracle服務(wù)器處理,這就占用大量的服務(wù)器時(shí)間,同時(shí)導(dǎo)致網(wǎng)絡(luò)擁擠。而PL/SQL是以整個(gè)語(yǔ)句塊發(fā)給服務(wù)器,這就降低了網(wǎng)絡(luò)擁擠。,服務(wù)器端PL/SQL不需要顯式的安裝或許可。它是Oracle9i數(shù)據(jù)庫(kù)的隱式部分,此處有相應(yīng)的文檔。PL/SQL編譯器和解釋器也嵌入到OracleDeveloper中,為開(kāi)發(fā)者在客戶(hù)端和服務(wù)器端提供一致的、可利用的開(kāi)發(fā)模型。,4.1.2開(kāi)發(fā)及運(yùn)行環(huán)境,4.2.2常量與變量,4.2.3數(shù)據(jù)類(lèi)型,4.2.4運(yùn)算符,4.2.1PL/SQL塊,4.2.5流程控制,4.2.6異常處理,4.2PL/SQL語(yǔ)法,,1.塊結(jié)構(gòu),2、塊的命名和匿名,3、塊的執(zhí)行,4.2.1PL/SQL塊,,1.塊結(jié)構(gòu)PL/SQL是一種塊結(jié)構(gòu)的語(yǔ)言,組成PL/SQL程序的單元是邏輯塊,一個(gè)PL/SQL程序包含了一個(gè)或多個(gè)邏輯塊,每個(gè)塊都可以劃分為三個(gè)部分。(1)塊的三個(gè)部分①聲明部分(Declarationsection)聲明部分包含了變量和常量的數(shù)據(jù)類(lèi)型和初始值。這個(gè)部分是由關(guān)鍵字DECLARE開(kāi)始,如果不需要聲明變量或常量,那么可以忽略這一部分。②執(zhí)行部分(Executablesection)執(zhí)行部分是PL/SQL塊中的指令部分,由關(guān)鍵字BEGIN開(kāi)始,所有的可執(zhí)行語(yǔ)句都放在這一部分,其他的PL/SQL塊也可以放在這一部分。③異常處理部分(Exceptionsection)這一部分是可選的,在這一部分中處理異?;蝈e(cuò)誤,對(duì)異常處理的詳細(xì)討論在后面進(jìn)行。,,(2)PL/SQL塊語(yǔ)法PL/SQL塊語(yǔ)法結(jié)構(gòu)如下:[DECLARE]declarationstatementsBEGINexecutablestatements[EXCEPTION]exceptionstatementsENDPL/SQL塊中的每一條語(yǔ)句都必須以分號(hào)結(jié)束,SQL語(yǔ)句可以多行,但分號(hào)表示該語(yǔ)句的結(jié)束。一行中可以有多條SQL語(yǔ)句,他們之間以分號(hào)分隔。每一個(gè)PL/SQL塊由BEGIN或DECLARE開(kāi)始,以END結(jié)束。注釋由--標(biāo)示。,,,2.塊的命名和匿名PL/SQL程序塊可以是一個(gè)命名的程序塊也可以是一個(gè)匿名程序塊,匿名程序塊可以用在服務(wù)器端也可以用在客戶(hù)端。執(zhí)行部分包含了所有的語(yǔ)句和表達(dá)式,執(zhí)行部分以關(guān)鍵字BEGIN開(kāi)始,以關(guān)鍵字EXCEPTION結(jié)束,如果EXCEPTION不存在,那么將以關(guān)鍵字END結(jié)束。分號(hào)分隔每一條語(yǔ)句,使用賦值操作符:=或SELECTINTO或FETCHINTO給每個(gè)變量賦值,執(zhí)行部分的錯(cuò)誤將在異常處理部分解決,在執(zhí)行部分中可以使用另一個(gè)PL/SQL程序塊,這種程序塊被稱(chēng)為嵌套塊。所有的SQL數(shù)據(jù)操作語(yǔ)句都可以用于執(zhí)行部分,PL/SQL塊不能在屏幕上顯示SELECT語(yǔ)句的輸出。SELECT語(yǔ)句必須包括一個(gè)INTO子串或者是游標(biāo)的一部分,執(zhí)行部分使用的變量和常量必須首先在聲明部分聲明,執(zhí)行部分必須至少包括一條可執(zhí)行語(yǔ)句,NULL是一條合法的可執(zhí)行語(yǔ)句,事物控制語(yǔ)句COMMIT和ROLLBACK可以在執(zhí)行部分使用,數(shù)據(jù)定義語(yǔ)言(DataDefinitionlanguage)不能在執(zhí)行部分中使用,DDL語(yǔ)句與EXECUTEIMMEDIATE一起使用或者是DBMS_SQL調(diào)用。,,3.塊的執(zhí)行SQL*PLUS中匿名的PL/SQL塊的執(zhí)行是在PL/SQL塊后輸入/來(lái)執(zhí)行。命名的程序與匿名程序的執(zhí)行不同,執(zhí)行命名的程序塊必須使用execute關(guān)鍵字:。如果在另一個(gè)命名程序塊或匿名程序塊中執(zhí)行這個(gè)程序,那么就不需要EXECUTE關(guān)鍵字。,,1.變量,2、常量,3、有效字符集,4.2.2常量與變量,,,1、變量(1)聲明變量聲明變量的語(yǔ)句格式如下:Variable_name[CONSTANT]databyte[NOTNULL][:=|DEFAULTexpression]注意:可以在聲明變量的同時(shí)給變量強(qiáng)制性的加上NOTNULL約束條件,此時(shí)變量在初始化時(shí)必須賦值。(2)給變量賦值給變量賦值有兩種方式:①直接給變量賦值②通過(guò)SQLSELECTINTO或FETCHINTO給變量賦值,,,2、常量常量與變量相似,但常量的值在程序內(nèi)部不能改變,常量的值在定義時(shí)賦予,聲明方式與變量相似,但必須包括關(guān)鍵字CONSTANT。常量和變量都可被定義為SQL和用戶(hù)定義的數(shù)據(jù)類(lèi)型。為了減少這部分程序的修改,編程時(shí)使用%TYPE、%ROWTYPE方式聲明變量,使變量聲明的類(lèi)型與表中的保持同步,隨表的變化而變化,這樣的程序在一定程度上具有更強(qiáng)的通用性。,,,3、有效字符集(1)所有的大寫(xiě)和小寫(xiě)英文字母;(2)數(shù)字0-9;(3)符號(hào):0+一*/<>=!一;:.‘@%,“‘?!埃Γ撸縖]PL/SQL標(biāo)識(shí)符的最大長(zhǎng)度是30個(gè)字符,并且不區(qū)分字母的大小寫(xiě)。但是適當(dāng)?shù)厥褂么笮?xiě),可以提高程序的可讀性。,,4.2.3數(shù)據(jù)類(lèi)型,例如:定義如下若干類(lèi)型變量,常量。DECLAREORDER_NONUMBER(3);CUST_NAMEVARCHAR2(20);ORDER_DATEDATE;EMP_NOINTEGER:=25;PICONSTANTNUMBER:=3.1416;BEGINNULL;END;,,4.2.4運(yùn)算符,與其他程序設(shè)計(jì)語(yǔ)言相同,PL/SQL有一系列操作符。主要有:算術(shù)操作符關(guān)系操作符邏輯操作符,,1.條件結(jié)構(gòu),2、循環(huán)控制,3、GOTO語(yǔ)句,4.2.5流程控制,4、嵌套,1、條件結(jié)構(gòu)1)If條件判斷邏輯結(jié)構(gòu)If條件判斷邏輯結(jié)構(gòu)有三種表達(dá)方式。①表達(dá)式一:ifconditionthenStatementendif該表達(dá)式的功能為:若條件為真,執(zhí)行then后的語(yǔ)句;否則,跳出條件語(yǔ)句執(zhí)行endif后的語(yǔ)句。②表達(dá)式二:ifconditionthenStatements_1elseStatements_2endif該表達(dá)式的功能為:如果條件為真執(zhí)行then后的語(yǔ)句,否則執(zhí)行else后的語(yǔ)句。③表達(dá)式三:ifcondition1thenStatements_1elseifcondition2thenStatements_2elseStatements_3endif該表達(dá)式的功能為:如果if后的條件成立,執(zhí)行then后面的語(yǔ)句,否則判斷elseif后面的條件,條件成立執(zhí)行第二個(gè)then后面的語(yǔ)句,否則執(zhí)行else后的語(yǔ)句。這是條件語(yǔ)句嵌套。IF可以嵌套,可以在IF或IF..ELSE語(yǔ)句中使用IF或IF…ELSE語(yǔ)句。,2)Case表達(dá)式Case語(yǔ)句的基本格式如下:Case變量WHEN表達(dá)式1then值1WHEN表達(dá)式2then值2WHEN表達(dá)式3then值3WHEN表達(dá)式4then值4ELSE值5END;Case語(yǔ)句的功能:首先設(shè)定變量的值作為條件,然后順序檢查表達(dá)式,一旦從中找到與條件匹配的表達(dá)式值,就停止case語(yǔ)句的處理。,2、循環(huán)控制(1)loop…exit…end循環(huán)控制語(yǔ)句LOOP循環(huán)語(yǔ)句是其中最基本的一種。LOOP語(yǔ)句的格式如下:LOOPstatementsENDLOOP;這種循環(huán)語(yǔ)句是沒(méi)有終止的,如果不人為控制的話,其中的statements將會(huì)無(wú)限地執(zhí)行。一般可以通過(guò)加入EXIT語(yǔ)句來(lái)終結(jié)該循環(huán)。(2)WHILE…..LOOP循環(huán)控制語(yǔ)句WHILE…..LOOP有一個(gè)條件與循環(huán)相聯(lián)系,如果條件為T(mén)RUE,則執(zhí)行循環(huán)體內(nèi)的語(yǔ)句,如果結(jié)果為FALSE,則結(jié)束循環(huán)。,(3)FOR..LOOP循環(huán)控制語(yǔ)句FOR..LOOP循環(huán)控制語(yǔ)句的格式如下:FORcounterIN[REVERSE]start_range..end_rangeLOOPstatements;ENDLOOP;LOOP和WHILE循環(huán)的循環(huán)次數(shù)都是不確定的,F(xiàn)OR循環(huán)的循環(huán)次數(shù)是固定的,counter是一個(gè)隱式聲明的變量,初始值是start_range,第二個(gè)值是start_range+1,直到end_range,如果start_range等于end_range,那么循環(huán)將執(zhí)行一次。如果使用了REVERSE關(guān)鍵字,那么范圍將是一個(gè)降序。,3、GOTO語(yǔ)句GOTO語(yǔ)句的格式如下:GOTOLABEL;執(zhí)行GOTO語(yǔ)句時(shí),控制會(huì)立即轉(zhuǎn)到由標(biāo)簽標(biāo)記的語(yǔ)句。PL/SQL中對(duì)GOTO語(yǔ)句有一些限制,對(duì)于塊、循環(huán)、IF語(yǔ)句而言,從外層跳轉(zhuǎn)到內(nèi)層是非法的。,4、嵌套程序塊的內(nèi)部可以有另一個(gè)程序塊這種情況稱(chēng)為嵌套。嵌套要注意的是變量,定義在最外部程序塊中的變量可以在所有子塊中使用,如果在子塊中定義了與外部程序塊變量相同的變量名,在執(zhí)行子塊時(shí)將使用子塊中定義的變量。子塊中定義的變量不能被父塊引用。同樣GOTO語(yǔ)句不能由父塊跳轉(zhuǎn)道子塊中,反之則是合法的。,,1.PL/SQL的異常,2、預(yù)定義異常,3、自定義異常,4.2.6異常處理,,,1、PL/SQL的異常異常處理塊中包含了與異常相關(guān)的錯(cuò)誤發(fā)生以及當(dāng)錯(cuò)誤發(fā)生時(shí)要進(jìn)行執(zhí)行和處理的代碼。異常部分的語(yǔ)法一般如下:BEGINEXCEPTIONWHENexcep_name1THEN…WHENexcep_name2THEN…WHENOTHERSTHEN…END;,,,2、預(yù)定義異常表4-3常見(jiàn)異常情況表,,,3、自定義異常異常不一定必須是oracle返回的系統(tǒng)錯(cuò)誤,用戶(hù)可以在自己的應(yīng)用程序中創(chuàng)建可觸發(fā)及可處理的自定義異常,調(diào)用異常處理需要使用Raise語(yǔ)句。異常情態(tài)的傳播指的是當(dāng)在程序塊的聲明、執(zhí)行、異常部分分別出現(xiàn)異常情態(tài)時(shí),或在本塊中沒(méi)有相應(yīng)的異常處理器時(shí)會(huì)將這個(gè)異常情態(tài)傳播到哪里,會(huì)去激發(fā)那個(gè)塊中的處理器。傳播規(guī)則是這樣的:當(dāng)一個(gè)異常情態(tài)是在塊的執(zhí)行部分引發(fā)的(最常見(jiàn)的),PL/SQL使用下面的規(guī)則確定激活哪個(gè)異常處理器。(1)若當(dāng)前塊對(duì)該異常情態(tài)設(shè)置了處理器,則執(zhí)行它并成功完成該塊的執(zhí)行,然后控制轉(zhuǎn)給包含塊。(2)若當(dāng)前塊沒(méi)有該處理器,則通過(guò)在包含塊中引發(fā)它來(lái)傳播異常情態(tài)。然后對(duì)包含塊執(zhí)行PL/SQL的異常操作。另外,無(wú)論是在聲明部分引發(fā)了一個(gè)異常情態(tài),還是在異常處理部分引發(fā),則該異常情態(tài)將立即傳播給包含塊。在包含塊引用上述規(guī)則進(jìn)行異常情態(tài)的處理,即使在當(dāng)前塊設(shè)置了OTHERS處理器也不會(huì)被執(zhí)行。,4.3.2存儲(chǔ)過(guò)程的調(diào)用,4.3.3存儲(chǔ)過(guò)程的釋放,4.3.4實(shí)例,4.3.1存儲(chǔ)過(guò)程的創(chuàng)建,4.3存儲(chǔ)過(guò)程,創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)句如下:CREATE[ORREPLACE]PROCEDURE<過(guò)程名><參數(shù)1>,「方式l]<數(shù)據(jù)類(lèi)型1>,<參數(shù)2>,[方式2]<數(shù)據(jù)類(lèi)型2>,……)IS|ASis_或as完全等價(jià)BEGINPL/SQL過(guò)程體END<過(guò)程名>,4.3.1存儲(chǔ)過(guò)程的創(chuàng)建,過(guò)程參數(shù)有以下三種類(lèi)型:(1)in參數(shù)類(lèi)型:表示輸入給過(guò)程的參數(shù)。(2)out參數(shù)類(lèi)型:表示參數(shù)在過(guò)程中將被賦值,可以傳給過(guò)程體的外部。(3)inout參數(shù)類(lèi)型:表示該類(lèi)參數(shù)既可以向過(guò)程體傳值,也可以在過(guò)程體中賦值,以便向過(guò)程體外傳值。,存儲(chǔ)過(guò)程可以直接用EXECUT命令調(diào)用或PL/SQL程序塊內(nèi)部調(diào)用。用EXECUT命令調(diào)用存儲(chǔ)過(guò)程的格式如下:SQL>executeproc_name(par1,par2…);,4.3.2存儲(chǔ)過(guò)程的調(diào)用,存儲(chǔ)過(guò)程也可以被另外的PL/SQL塊調(diào)用,調(diào)用的語(yǔ)句是:declarepar1,par2;beginproc_name(par1,par2…);end;在調(diào)用前要聲明變量par1,par2,當(dāng)某個(gè)存儲(chǔ)過(guò)程不再需要時(shí),應(yīng)將其從內(nèi)存中刪除,以釋放它占用的內(nèi)存資源。釋放過(guò)程的語(yǔ)句格式如下:SQL>dropprocedureproc_name;proc_name為過(guò)程名。,4.3.3存儲(chǔ)過(guò)程的釋放,編寫(xiě)存儲(chǔ)過(guò)程,顯示所指定雇員名所在的部門(mén)名和位置。CREATEORREPLACEPROCEDUREDeptMesg(penameemp.ename%TYPE,pdnameOUTdept.dname%TYPE,plocOUTdept.loc%TYPE)ASBEGINSELECTdname,locINTOpdname,plocFROMemp,deptWHEREemp.deptno=dept.deptnoANDemp.ename=pename;END;/VARIABLEvdnameVARCHAR2(14);VARIABLEvlocVARCHAR2(13);EXECUTEDeptMesg(SMITH,:vdname,:vloc);PRINTvdnamevloc;,4.3.4實(shí)例,4.4.2觸發(fā)器的類(lèi)型,4.4.3觸發(fā)器的創(chuàng)建,4.4.4觸發(fā)器的修改和刪除,4.4.1觸發(fā)器的設(shè)計(jì)規(guī)則,4.4觸發(fā)器,4.4.5實(shí)例,(1)作用范圍清晰(2)不要讓觸發(fā)器去完成Oracle后臺(tái)已經(jīng)能夠完成的功能(3)限制觸發(fā)器代碼的行數(shù)(4)不要?jiǎng)?chuàng)建遞歸的觸發(fā)器(5)觸發(fā)器僅在被觸發(fā)語(yǔ)句觸發(fā)時(shí)進(jìn)行集中的,全局的操作,同用戶(hù)和數(shù)據(jù)庫(kù)應(yīng)用無(wú)關(guān)。,4.4.1觸發(fā)器的設(shè)計(jì)規(guī)則,可以創(chuàng)建被如下語(yǔ)句所觸發(fā)的觸發(fā)器:(1)DML語(yǔ)句(DELETE,INSERT,UPDATE);(2)DDL語(yǔ)句(CREATE,ALTER,DROP);(3)數(shù)據(jù)庫(kù)操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。,4.4.2觸發(fā)器的類(lèi)型,1.使用CREATETRIGGER語(yǔ)句創(chuàng)建觸發(fā)器使用CREATETRIGGER語(yǔ)句創(chuàng)建觸發(fā)器的語(yǔ)句格式如下:CREATE[ORREPLACE]TRIGGERname{BEFORE|AFTER}{event[OR...]}ONtable[FOR[EACH]{ROW|STATEMENT}][WHEN(condition)]plsqlblock|callprocedures_statement,4.4.3觸發(fā)器的創(chuàng)建,2.注意事項(xiàng)(1)觸發(fā)器可以聲明為在對(duì)記錄進(jìn)行操作之前,在之前(檢查約束之前和INSERT,UPDATE或DELETE執(zhí)行前)或之后(在檢查約束之后和完成INSERT,UPDATE或DELETE操作)觸發(fā).。(2)一個(gè)FOREACHROW執(zhí)行指定操作的觸發(fā)器為操作修改的每一行都調(diào)用一次。(3)SELECT并不更改任何行,因此不能創(chuàng)建SELECT觸發(fā)器.這種場(chǎng)合下規(guī)則和視圖更適合。(4)觸發(fā)器和某一指定的表格有關(guān),當(dāng)該表格備刪除時(shí),任何與該表有關(guān)的觸發(fā)器同樣會(huì)被刪除。(5)在一個(gè)表上的每一個(gè)動(dòng)作只能有一個(gè)觸發(fā)器與之關(guān)聯(lián)。(6)在一個(gè)單獨(dú)的表上,最多只能創(chuàng)建三個(gè)觸發(fā)器與之關(guān)聯(lián),一個(gè)INSERT觸發(fā)器,一個(gè)DELETE觸發(fā)器和一個(gè)UPDATE觸發(fā)器。,刪除觸發(fā)器的語(yǔ)句格式為:DROPTRIGGERnameONtable;一個(gè)觸發(fā)器由三部分組成:觸發(fā)事件或語(yǔ)句、觸發(fā)限制和觸發(fā)器動(dòng)作。觸發(fā)事件或語(yǔ)句是指引起激發(fā)觸發(fā)器的SQL語(yǔ)句,可為對(duì)一指定表的INSERT、UNPDATE或DELETE語(yǔ)句。觸發(fā)限制是指定一個(gè)布爾表達(dá)式,當(dāng)觸發(fā)器激發(fā)時(shí)該布爾表達(dá)式是必須為真。觸發(fā)器作為過(guò)程,是PL/SQL塊,當(dāng)觸發(fā)語(yǔ)句發(fā)出、觸發(fā)限制計(jì)算為真時(shí)該過(guò)程被執(zhí)行。,4.4.4觸發(fā)器的修改和刪除,編寫(xiě)一個(gè)數(shù)據(jù)庫(kù)觸發(fā)器,當(dāng)任何時(shí)候某個(gè)部門(mén)從dept表中刪除時(shí),該觸發(fā)器將從emp表中刪除該部門(mén)的所有雇員。CREATEORREPLACETRIGGERdel_emp_deptnoBEFOREDELETEONdeptFOREACHROWBEGINDELETEFROMempWHEREdeptno=:OLD.deptno;END;,4.4.5實(shí)例,4.5.2隱式游標(biāo),4.5.3實(shí)例,4.5.1顯式游標(biāo),4.5游標(biāo),Oracle游標(biāo)是一種用于輕松的處理多行數(shù)據(jù)的機(jī)制,沒(méi)有游標(biāo),Oracle開(kāi)發(fā)人員必須單獨(dú)地、顯式地取回并管理游標(biāo)查詢(xún)選擇的每一條記錄。游標(biāo)的另一項(xiàng)功能是,它包含一個(gè)跟蹤當(dāng)前訪問(wèn)的記錄的指針,這使程序能夠一次處理多條記錄。,,1.聲明游標(biāo),2、打開(kāi)游標(biāo),3、從游標(biāo)中取回?cái)?shù)據(jù),4.5.1顯式游標(biāo),4、關(guān)閉游標(biāo),,1.聲明游標(biāo)聲明游標(biāo)的語(yǔ)句格式如下:DECLAREcursor_nameISSELECTstatement聲明游標(biāo)完成了下面兩個(gè)目的:(1)給游標(biāo)命名;(2)將一個(gè)查詢(xún)與游標(biāo)關(guān)聯(lián)起來(lái)。,,,2.打開(kāi)游標(biāo)打開(kāi)游標(biāo)的語(yǔ)句格式如下:OPENcursor_name;打開(kāi)游標(biāo)將激活查詢(xún)并識(shí)別活動(dòng)集,可是在執(zhí)行游標(biāo)取回命令之前,并沒(méi)有真正取回記錄。OPEN命令還初始化了游標(biāo)指針,使其指向活動(dòng)集的第一條記錄。游標(biāo)被打開(kāi)后,直到關(guān)閉之前,取回到活動(dòng)集的所有數(shù)據(jù)都是靜態(tài)的。換句話說(shuō),游標(biāo)忽略所有在游標(biāo)打開(kāi)之后,對(duì)數(shù)據(jù)執(zhí)行的SQLDML命令(INSERT、UPDATE、DELETE和SELECT),因此只有在需要時(shí)才打開(kāi)它,要刷新活動(dòng)集,只需關(guān)閉并重新打開(kāi)游標(biāo)即可。,,,3.從游標(biāo)中取回?cái)?shù)據(jù)FETCH命令以每次一條記錄的方式取回活動(dòng)集中的記錄。通常將FETCH命令和某種迭代處理結(jié)合起來(lái)使用,在迭代處理中,F(xiàn)ETCH命令每執(zhí)行一次,游標(biāo)前進(jìn)到活動(dòng)集的下一條記錄。FETCH命令的語(yǔ)句格式如下:FETCHcursor_nameINTOrecord_list;執(zhí)行FETCH命令后,活動(dòng)集中的結(jié)果被取回到PL/SQL變量中,以便在PL/SQL塊中使用。每取回一條記錄,游標(biāo)的指針就移向活動(dòng)集的下一條記錄。,,,4.關(guān)閉游標(biāo)CLOSE語(yǔ)句關(guān)閉以前打開(kāi)的游標(biāo),使得活動(dòng)集不確定。CLOSE語(yǔ)句的格式:CLOSEcursor_name;,,,隱式游標(biāo)也可以叫做SQL游標(biāo)。和顯式的游標(biāo)不同,不能對(duì)一個(gè)SQL游標(biāo)顯式的執(zhí)行OPEN,CLOSE和FETCH語(yǔ)句。Oracle隱式的打開(kāi)SQL游標(biāo)、處理SQL游標(biāo)、然后再關(guān)閉該游標(biāo)。Oracle提供隱式游標(biāo)的主要目的就是利用這些游標(biāo)的屬性來(lái)確定SQL語(yǔ)句運(yùn)行的情況。,4.5.2隱式游標(biāo),,,以上游標(biāo)應(yīng)用的完整程序代碼如下:DECLARECURSORC1ISSELECTVIEW_NAMEFROMALL_VIEWSWHEREROWNUMIS變量、常量及數(shù)據(jù)類(lèi)型定義;游標(biāo)定義;函數(shù)、過(guò)程定義和參數(shù)列表及返回類(lèi)型;END<包名>;,,2.包主體部分創(chuàng)建包主體部分的語(yǔ)句格式如下:CREATEPACKAGEBODY<包名>AS游標(biāo)、函數(shù)、過(guò)程的具體定義;END<包名>;,,1.描述部分,2、包體部分,4.6.2實(shí)例,,1.描述部分CREATEPACKAGEznz_package//創(chuàng)建包頭ISman_numNUMBER;//定義變量woman_numNUMBER;CURSOR學(xué)生;//定義游標(biāo)CREATEFUNCTIONf_count(insexIN學(xué)生.sex%TYPE)//定義函數(shù)RETURNNUMBER;//定義返回值類(lèi)型CREATEPROCEDUREp_count//定義過(guò)程(in_sexIN學(xué)生.sex%TYPE,//過(guò)程參數(shù)out_numOUTNUMBER);ENDznz_package;//包頭結(jié)束,,2.包體部分CREATEPACKAGEBODYznz_package//創(chuàng)建包體ASCURSOR學(xué)生IS//游標(biāo)具體定義SELECT學(xué)號(hào),姓名FROM學(xué)生WHERE學(xué)號(hào)executeman_num:=count_num(‘女’),,3.函數(shù)的釋放當(dāng)函數(shù)不再使用時(shí),要用drop命令將其從內(nèi)存中刪除,例如:SQL>dropfunctioncount_num;,,4.實(shí)例編寫(xiě)一個(gè)函數(shù)以顯示該雇員在此組織中的工作天數(shù)。CREATEORREPLACEFUNCTIONHire_Day(noemp.empno%TYPE)RETURNNUMBERASvhiredateemp.hiredate%TYPE;vdayNUMBER;BEGINSELECThiredateINTOvhiredateFROMempWHEREempno=no;vday:=CEIL(SYSDATE-vhiredate);RETURNvday;END;,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Oracle 數(shù)據(jù)庫(kù) 管理
鏈接地址:http://zhongcaozhi.com.cn/p-11549555.html