版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)用數(shù)據(jù)庫(kù)技術(shù)
Oracle10g數(shù)據(jù)庫(kù)管理系統(tǒng)學(xué)習(xí)內(nèi)容Oracle概述Oracle10g數(shù)據(jù)庫(kù)安裝Oracle10g數(shù)據(jù)庫(kù)卸載Oracle10g常用管理工具Oracle10g表管理使用過(guò)程和觸發(fā)器Oracle概述Oracle公司Oracle數(shù)據(jù)庫(kù)Oracle10g數(shù)據(jù)庫(kù)安裝服務(wù)器安裝需求版本企業(yè)版標(biāo)準(zhǔn)版?zhèn)€人版最低配置
CPU:Pentium166
內(nèi)存:128MB
硬盤空間:企業(yè)版(1.76GB):標(biāo)準(zhǔn)版(1.76GB):個(gè)人版(1.72GB)
視頻:256色Oracle10g數(shù)據(jù)庫(kù)安裝客戶端安裝需求安裝類型管理者(administrator)運(yùn)行時(shí)環(huán)境(runtime)自定義(custom)最低配置
CPU:Pentium166
內(nèi)存:128MB
硬盤空間:管理者(647MB):運(yùn)行時(shí)環(huán)境(486MB)
Oracle10g數(shù)據(jù)庫(kù)安裝過(guò)程(略)Oracle數(shù)據(jù)庫(kù)卸載1、停止服務(wù)2、卸載Oracle產(chǎn)品3、清理注冊(cè)表4、清理環(huán)境變量5、清理磁盤Oracle卸載1/5開(kāi)始->設(shè)置->控制面板->管理工具->服務(wù)停止所有Oracle服務(wù)Oracle卸載2/5開(kāi)始->程序->OracleInstallationProducts->UniversalInstaller卸裝所有Oracle產(chǎn)品,但UniversalInstaller本身不能被刪除Oracle卸載3/5運(yùn)行regeditHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services滾動(dòng)這個(gè)列表,刪除所有Oracle入口。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,除所有Oracle入口。Oracle卸載載4/5開(kāi)始始-->>設(shè)設(shè)置置-->>控控制制面面板板-->>系系統(tǒng)統(tǒng)-->>高高級(jí)級(jí)-->>環(huán)環(huán)境境變變量量刪除除環(huán)環(huán)境境變變量量CLASSPATH和PATH中有有關(guān)關(guān)Oracle的設(shè)設(shè)定定Oracle卸載載5/5從桌桌面面上上、、STARTUP(啟啟動(dòng)動(dòng)))組組、、程程序序菜菜單單中中,,刪刪除除所所有有有有關(guān)關(guān)Oracle的組組和和圖圖標(biāo)標(biāo)刪除除\ProgramFiles\Oracle目錄錄重新新啟啟動(dòng)動(dòng)計(jì)計(jì)算算機(jī)機(jī),,重重起起后后才才能能完完全全刪刪除除Oracle所在在目目錄錄,刪除除與與Oracle有關(guān)關(guān)的的文文件件,,選選擇擇Oracle所在在的的缺缺省省目目錄錄C:\Oracle,刪刪除除這這個(gè)個(gè)入入口口目目錄錄及及所所有有子子目目錄錄,,并并從從Windows2000目錄錄((一一般般為為C:\WINNT)下下刪刪除除以以下下文文件件ORACLE.INI、oraodbc.ini等等等。。Oracle10g常用用管管理理工工具具OEM控制制臺(tái)臺(tái)SQL*PLUS工具具介介紹紹Oracle10g表管管理理在Oracle中建建表表,,主主要要有有兩兩種種方方式式::一種種是是在在SQL*PLUS中執(zhí)執(zhí)行行建建表表的的SQL語(yǔ)句句。。另一一種種是是通通過(guò)過(guò)OEM工具具。。Oracle10g數(shù)據(jù)據(jù)中中的的數(shù)數(shù)據(jù)據(jù)類類型型數(shù)據(jù)類型類型說(shuō)明CHAR字符型,最長(zhǎng)為2000BNCHAR基于字符集的字符型,同上VARCHAR2變長(zhǎng)字符型,最長(zhǎng)為4000BNVARCHAR2基于字符集的變長(zhǎng)字符型,同上VARCHAR同VARCHAR2LONG變長(zhǎng)字符型,最長(zhǎng)為2GBNUMBER(s,d)數(shù)字型,總位數(shù)為s位,小數(shù)位為d位,總長(zhǎng)最大為38位DATE日期型RAW純二進(jìn)制數(shù)據(jù)類型,最長(zhǎng)為2000BLONGRAW變長(zhǎng)二進(jìn)制數(shù)據(jù)類型,最長(zhǎng)為2GBBLOB二進(jìn)制大對(duì)象類型,最長(zhǎng)為4GBNLOB包含定寬的多位數(shù)字符的字符大對(duì)象類型,最長(zhǎng)為4GBCLOB包含單個(gè)字符的字符大對(duì)象類型,最長(zhǎng)為4GBBFILE數(shù)據(jù)庫(kù)外的大型二進(jìn)制文件的輸入指示器類型,最大為4GBPL/SQL語(yǔ)言言基基礎(chǔ)礎(chǔ)注釋釋變量量聲聲明明運(yùn)算算符符PL/SQL塊結(jié)結(jié)構(gòu)構(gòu)控制制語(yǔ)語(yǔ)句句PL/SQL程序序設(shè)設(shè)計(jì)計(jì)簡(jiǎn)簡(jiǎn)介介PL/SQL是一種高高級(jí)數(shù)據(jù)據(jù)庫(kù)程序序設(shè)計(jì)語(yǔ)語(yǔ)言,該該語(yǔ)言專專門用于于在各種種環(huán)境下下對(duì)ORACLE數(shù)據(jù)庫(kù)進(jìn)進(jìn)行訪問(wèn)問(wèn)。由于于該語(yǔ)言言集成于于數(shù)據(jù)庫(kù)庫(kù)服務(wù)器器中,所所以PL/SQL代碼可以以對(duì)數(shù)據(jù)據(jù)進(jìn)行快快速高效效的處理理。除此此之外,,可以在在ORACLE數(shù)據(jù)庫(kù)的的某些客客戶端工工具中,,使用PL/SQL語(yǔ)言也是是該語(yǔ)言言的一個(gè)個(gè)特點(diǎn)。。SQL與PL/SQLPL/SQL是ProcedureLanguage&StructuredQueryLanguage的縮寫。。ORACLE的SQL是支持ANSI(AmericannationalStandardsInstitute)和ISO92(InternationalStandardsOrganization)標(biāo)準(zhǔn)的產(chǎn)產(chǎn)品。PL/SQL是對(duì)SQL語(yǔ)言存儲(chǔ)儲(chǔ)過(guò)程語(yǔ)語(yǔ)言的擴(kuò)擴(kuò)展。為什么使使用PL/SQL有利于客客戶/服務(wù)器環(huán)環(huán)境應(yīng)用用的運(yùn)行行適合于客客戶環(huán)境境PL/SQL塊結(jié)構(gòu)PL/SQL程序由三三個(gè)塊組組成,即即聲明部部分、執(zhí)執(zhí)行部分分、異常常處理部部分。DECLARE/*聲明部分分:在此聲明明PL/SQL用到的變變量,類型及游游標(biāo),以以及局部部的存儲(chǔ)儲(chǔ)過(guò)程和和函數(shù)*/BEGIN/*執(zhí)行部分分:過(guò)程及SQL語(yǔ)句,即程序的的主要部部分*/EXCEPTION/*執(zhí)行異常常部分:錯(cuò)誤處理理*/END;PL/SQL塊可以分分為三類類無(wú)名塊::動(dòng)態(tài)構(gòu)構(gòu)造,只只能執(zhí)行行一次。。子程序::存儲(chǔ)在在數(shù)據(jù)庫(kù)庫(kù)中的存存儲(chǔ)過(guò)程程、函數(shù)數(shù)及包等等。當(dāng)在在數(shù)據(jù)庫(kù)庫(kù)上建立立好后可可以在其其它程序序中調(diào)用用它們。。觸發(fā)器::當(dāng)數(shù)據(jù)據(jù)庫(kù)發(fā)生生操作時(shí)時(shí),會(huì)觸觸發(fā)一些些事件,,從而自自動(dòng)執(zhí)行行相應(yīng)的的程序。。標(biāo)識(shí)符PL/SQL程序設(shè)計(jì)計(jì)中的標(biāo)標(biāo)識(shí)符定定義與SQL的標(biāo)識(shí)符符定義的的要求相相同。要要求和限限制有::標(biāo)識(shí)符名名不能超超過(guò)30字符;第一個(gè)字字符必須須為字母母;不分大小小寫;不能用’’-‘(減號(hào));不能是SQL保留字。。實(shí)例下面的例例子將會(huì)會(huì)刪除所所有的紀(jì)紀(jì)錄,而而不是KING的記錄。。DECLAREv_enamevarchar2(20):='KING';BEGINDELETEFROMempWHEREename=v_ename;END;如何運(yùn)行行PL/SQL塊結(jié)構(gòu)??如何運(yùn)行行PL/SQL塊結(jié)構(gòu)??建議的命命名方法法PL/SQL變量類型型實(shí)例插入一條條記錄并并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGININSERTINTOdeptVALUES(90,'SERVICE','BEIJING')RETURNINGrowid,dname||':'||to_char(deptno)||':'||locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型型實(shí)例其中,RETURNING子句用于于檢索INSERT語(yǔ)句中所所影響的的數(shù)據(jù)行行數(shù),當(dāng)當(dāng)INSERT語(yǔ)句使用用VALUES子句插入入數(shù)據(jù)時(shí)時(shí),RETURNING子句還可可將列表表達(dá)式、、ROWID和REF值返回到到輸出變變量中。。在使用用RETURNING子句是應(yīng)應(yīng)注意以以下幾點(diǎn)點(diǎn)限制::不能并行行DML語(yǔ)句;不能檢索索LONG類型信息息;當(dāng)通過(guò)視視圖向基基表中插插入數(shù)據(jù)據(jù)時(shí),只只能與單單基表視視圖一起起使用。。PL/SQL變量類型型實(shí)例修改一條條記錄并并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGINUPDATEdeptSETdeptno=80WHEREDNAME='SERVICE'RETURNINGrowid,dname||':'||to_char(deptno)||':'||locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型型實(shí)例其中,RETURNING子句用于于檢索被被修改行行信息,,當(dāng)UPDATE語(yǔ)句修改改單行數(shù)數(shù)據(jù)時(shí),,RETURNING子句可以以檢索被被修改行行的ROWID值,以及及行中被被修改列列的列表表達(dá)式,,并可將將他們存存儲(chǔ)到PL/SQL變量或復(fù)復(fù)合變量量中;當(dāng)當(dāng)UPDATE語(yǔ)句修改改多行數(shù)數(shù)據(jù)時(shí),,RETURNING子句可以以將被修修改行的的ROWID值,以及及列表達(dá)達(dá)式值返返回到復(fù)復(fù)合變量量數(shù)組中中。在UPDATE中使用RETURNING子句的限限制與INSERT語(yǔ)句中對(duì)對(duì)RETURNING子句的限限制相同同。PL/SQL變量類型型實(shí)例刪除一條條記錄并并顯示DECLARERow_idROWID;infoVARCHAR2(40);BEGINDELETEdeptWHEREDNAME='SERVICE'RETURNINGrowid,dname||':'||to_char(deptno)||':'||locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL變量類型型實(shí)例RETURNING子句用于于檢索被被刪除行行信息,,當(dāng)DELETE語(yǔ)句修改改單行數(shù)數(shù)據(jù)時(shí),,RETURNING子句可以以檢索被被刪除行行的ROWID,以及被被刪除行行中列的的列表達(dá)達(dá)式,并并可將他他們存儲(chǔ)儲(chǔ)到PL/SQL變量或復(fù)復(fù)合變量量中;當(dāng)當(dāng)UPDATE語(yǔ)句修改改多行數(shù)數(shù)據(jù)時(shí),,RETURNING子句可以以將被修修改行的的ROWID,以及列列表達(dá)式式值返回回到復(fù)合合變量數(shù)數(shù)組中。。在UPDATE中使用RETURNING子句的限限制與INSERT語(yǔ)句中對(duì)對(duì)RETURNING子句的限限制相同同。復(fù)合類型型ORACLE在PL/SQL中除了提提供象前前面介紹紹的各種種類型外外,還提提供一種種稱為復(fù)復(fù)合類型型的類型型---記錄和表表。記錄類型型使用%TYPE使用%ROWTYPE記錄類型型記錄類型是是把邏輯相相關(guān)的數(shù)據(jù)據(jù)作為一個(gè)個(gè)單元存儲(chǔ)儲(chǔ)起來(lái),它它必須包括括至少一個(gè)個(gè)標(biāo)量型((數(shù)字型、、字符型、、布爾型、、日期型))或RECORD數(shù)據(jù)類型的的成員,稱稱作PL/SQLRECORD的域(FIELD),其作用是是存放互不不相同但邏邏輯相關(guān)的的信息。定義記錄類類型語(yǔ)法如如下:TYPErecord_typeISRECORD(Field1type1[NOTNULL][:=exp1],Field2type2[NOTNULL][:=exp2],......Fieldntypen[NOTNULL][:=expn]);實(shí)例DECLARETYPEtest_recISRECORD(CodeVARCHAR2(10),NameVARCHAR2(30)NOTNULL:='abook');V_booktest_rec;BEGINV_book.code:='123';V_:='C++Programming';DBMS_OUTPUT.PUT_LINE(v_book.code||v_);END;使用%TYPE定義一個(gè)變變量,其數(shù)數(shù)據(jù)類型與與已經(jīng)定義義的某個(gè)數(shù)數(shù)據(jù)變量的的類型相同同,或者與與數(shù)據(jù)庫(kù)表表的某個(gè)列列的數(shù)據(jù)類類型相同,,這時(shí)可以以使用%TYPE。使用%TYPE特性的優(yōu)點(diǎn)點(diǎn)在于:所引用的數(shù)數(shù)據(jù)庫(kù)列的的數(shù)據(jù)類型型可以不必必知道;所引用的數(shù)數(shù)據(jù)庫(kù)列的的數(shù)據(jù)類型型可以實(shí)時(shí)時(shí)改變。實(shí)例1DECLARE--用%TYPE類型型定義與表表相配的字字段TYPEt_RecordISRECORD(T_noemp.empno%TYPE,T_nameemp.ename%TYPE,T_salemp.sal%TYPE);--聲明明接收數(shù)據(jù)據(jù)的變量v_empt_Record;BEGINSELECTempno,ename,salINTOv_empFROMempWHEREempno=7788;DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)||v_emp.t_name||TO_CHAR(v_emp.t_sal));END;實(shí)例2DECLAREv_empnoemp.empno%TYPE:=&no;Typer_recordisrecord(v_nameemp.ename%TYPE,v_salemp.sal%TYPE,v_dateemp.hiredate%TYPE);Recr_record;BEGINSELECTename,sal,hiredateINTORecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'--'||Rec.v_date);END;使用%ROWTYPEPL/SQL提供%ROWTYPE操作符,返回一個(gè)記記錄類型,,其數(shù)據(jù)類類型和數(shù)據(jù)據(jù)庫(kù)表的數(shù)數(shù)據(jù)結(jié)構(gòu)相相一致。使用%ROWTYPE特性的優(yōu)點(diǎn)點(diǎn)在于:所引用的數(shù)數(shù)據(jù)庫(kù)中列列的個(gè)數(shù)和和數(shù)據(jù)類型型可以不必必知道;所引用的數(shù)數(shù)據(jù)庫(kù)中列列的個(gè)數(shù)和和數(shù)據(jù)類型型可以實(shí)時(shí)時(shí)改變。實(shí)例DECLAREv_empnoemp.empno%TYPE:=&no;recemp%ROWTYPE;BEGINSELECT*INTOrecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工工資:'||rec.sal||'工工作時(shí)間:'||rec.hiredate);END;運(yùn)算符和表表達(dá)式算術(shù)運(yùn)算符符運(yùn)算符和表表達(dá)式關(guān)系運(yùn)算符符運(yùn)算符和表表達(dá)式邏輯運(yùn)算符符變量賦值在PL/SQL編程中,變變量賦值是是一個(gè)值得得注意的地地方,它的的語(yǔ)法如下下:variable是一個(gè)PL/SQL變量,expression是一個(gè)PL/SQL表達(dá)式。variable:=expression;字符及數(shù)字字運(yùn)算特點(diǎn)點(diǎn)空值加數(shù)字字仍是空值值:NULL+<數(shù)字>=NULL空值加(連連接)字符符,結(jié)果為為字符:NULL||<字符串>=<字符串>BOOLEAN賦值布爾值只有有TRUE,FALSE及NULL三個(gè)值。如如:DECLAREdoneBOOLEAN;/*thefollowingstatementsarelegal:*/BEGINdone:=FALSE;WHILENOTdoneLOOPNull;ENDLOOP;END;游標(biāo)賦值游標(biāo)賦值是是通過(guò)SELECT語(yǔ)句來(lái)完成成的,每次次執(zhí)行SELECT語(yǔ)句就賦值值一次,一一般要求被被賦值的變變量與SELECT中的列名要要一一對(duì)應(yīng)應(yīng)。游標(biāo)賦值DECLAREemp_idemp.empno%TYPE:=7788;emp_nameemp.ename%TYPE;wagesemp.sal%TYPE;BEGINSELECTename,NVL(sal,0)+NVL(comm,0)INTOemp_name,wagesFROMempWHEREempno=emp_id;DBMS_OUTPUT.PUT_LINE(emp_name||’----‘‘||to_char(wages));END;結(jié)果:SCOTT----3000可轉(zhuǎn)換的類類型賦值CHAR轉(zhuǎn)換為NUMBER:使用TO_NUMBER函數(shù)來(lái)完成成字符到數(shù)數(shù)字的轉(zhuǎn)換換,如:v_total:=TO_NUMBER(‘100.0’’)+sal;NUMBER轉(zhuǎn)換為CHAR:使用TO_CHAR函數(shù)可以實(shí)實(shí)現(xiàn)數(shù)字到到字符的轉(zhuǎn)轉(zhuǎn)換,如::v_comm:=TO_CHAR(‘123.45’)||’元’;字符轉(zhuǎn)換為為日期:使用TO_DATE函數(shù)可以實(shí)實(shí)現(xiàn)字字符到日期期的轉(zhuǎn)換,,如:v_date:=TO_DATE('2001.07.03','yyyy.mm.dd');日期轉(zhuǎn)換為為字符:使用TO_CHAR函數(shù)可以實(shí)實(shí)現(xiàn)日期到到字符的轉(zhuǎn)轉(zhuǎn)換,如::v_to_day:=TO_CHAR(SYSDATE,'yyyy.mm.ddhh24:mi:ss');變量作用范范圍及可見(jiàn)見(jiàn)性PL/SQL的變量作用用范圍特點(diǎn)點(diǎn)是:變量的作用用范圍是在在你所引用用的程序單單元(塊、、子程序、、包)內(nèi)。。即從聲明明變量開(kāi)始始到該塊的的結(jié)束。一個(gè)變量((標(biāo)識(shí))只只能在你所所引用的塊塊內(nèi)是可見(jiàn)見(jiàn)的。當(dāng)一個(gè)變量量超出了作作用范圍,,PL/SQL引擎就釋放放用來(lái)存放放該變量的的空間(因因?yàn)樗赡苣懿挥昧耍T谧訅K中重重新定義該該變量后,,它的作用用僅在該塊塊內(nèi)。實(shí)例DECLAREEmesschar(80);BEGINDECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=’president’;DBMS_OUTPUT.PUT_LINE(V1);EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(‘Morethanonepresident’);END;實(shí)例續(xù)續(xù)…DECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=’manager’;EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(‘Morethanonemanager’’);END;EXCEPTIONWhenothersTHENEmess:=substr(SQLERRM,1,80);DBMS_OUTPUT.PUT_LINE(emess);END;注釋在PL/SQL里,可以使使用兩種符符號(hào)來(lái)寫注注釋,即::使用雙‘‘-‘(減號(hào))加注釋V_SalNUMBER(12,2);--工資變量。。使用/**/來(lái)加一行或或多行注釋釋/***********************************************//*文件名:department_salary.sql*//***********************************************/示例簡(jiǎn)單單數(shù)據(jù)插入入例子DECLAREv_enameVARCHAR2(20):=‘Bill’;v_salNUMBER(7,2):=1234.56;v_deptnoNUMBER(2):=10;v_empnoNUMBER(4):=8888;BEGININSERTINTOemp(empno,ename,JOB,sal,deptno,hiredate)VALUES(v_empno,v_ename,‘Manager’,v_sal,v_deptno,TO_DATE(’’1954.06.09’,’yyyy.mm.dd’’));COMMIT;END;示例簡(jiǎn)單單數(shù)據(jù)刪除除例子DECLAREv_empnonumber(4):=8888;BEGINDELETEFROMempWHEREempno=v_empno;COMMIT;END;PL/SQL流程程控控制制語(yǔ)語(yǔ)句句PL/SQL的流流程程控控制制語(yǔ)語(yǔ)句句包包括括如如下下三三類類::控制制語(yǔ)語(yǔ)句句::IF語(yǔ)句句;;循環(huán)環(huán)語(yǔ)語(yǔ)句句::LOOP語(yǔ)句句,,EXIT語(yǔ)句句;;順序序語(yǔ)語(yǔ)句句::GOTO語(yǔ)句句,,NULL語(yǔ)句句。。條件件語(yǔ)語(yǔ)句句IF<布爾爾表表達(dá)達(dá)式式>THENPL/SQL和SQL語(yǔ)句句ENDIF;IF<布爾爾表表達(dá)達(dá)式式>THENPL/SQL和SQL語(yǔ)句句ELSE其它它語(yǔ)語(yǔ)句句ENDIF;條件件語(yǔ)語(yǔ)句句IF<布爾爾表表達(dá)達(dá)式式>THENPL/SQL和SQL語(yǔ)句句ELSIF<其它它布布爾爾表表達(dá)達(dá)式式>THEN其它它語(yǔ)語(yǔ)句句ELSIF<其它它布布爾爾表表達(dá)達(dá)式式>THEN其它它語(yǔ)語(yǔ)句句ELSE其它它語(yǔ)語(yǔ)句句ENDIF;條件件語(yǔ)語(yǔ)句句實(shí)實(shí)例例DECLAREv_empnoemp.empno%TYPE:=&empno;V_salaryemp.sal%TYPE;V_commentVARCHAR2(35);BEGINSELECTsalINTOv_salaryFROMempWHEREempno=v_empno;IFv_salary<1500THENV_comment:='Fairlyless';ELSIFv_salary<3000THENV_comment:='Alittlemore';ELSEV_comment:='Lotsofsalary';ENDIF;DBMS_OUTPUT.PUT_LINE(V_comment);END;CASE表達(dá)達(dá)式式CASEselectorWHENexpression1THENresult1WHENexpression2THENresult2WHENexpressionNTHENresultN[ELSEresultN+1]END;CASE表達(dá)達(dá)式式實(shí)實(shí)例例DECLAREV_gradechar(1):=UPPER('&p_grade');V_appraisalVARCHAR2(20);BEGINV_appraisal:=CASEv_gradeWHEN'A'THEN'Excellent'WHEN'B'THEN'VeryGood'WHEN'C'THEN'Good'ELSE'Nosuchgrade'END;DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||'Appraisal:'||v_appraisal);END;CASE表達(dá)達(dá)式式實(shí)實(shí)例例代碼碼運(yùn)運(yùn)行行結(jié)結(jié)果果::Entervalueforp_grade:Aold2:V_gradechar(1):=UPPER('&p_grade');new2:V_gradechar(1):=UPPER('A');Grade:AAppraisal:Excellent循環(huán)環(huán)簡(jiǎn)單單循循環(huán)環(huán)LOOP要執(zhí)執(zhí)行行的的語(yǔ)語(yǔ)句句;EXITWHEN<條件件語(yǔ)語(yǔ)句句>/*條件件滿滿足足,,退退出出循循環(huán)環(huán)語(yǔ)語(yǔ)句句*/ENDLOOP;LOOP循環(huán)環(huán)實(shí)實(shí)例例DECLAREintNUMBER(2):=0;BEGINLOOPint:=int+1;DBMS_OUTPUT.PUT_LINE('int的當(dāng)當(dāng)前前值值為為:'||int);EXITWHENint=10;ENDLOOP;END;循環(huán)環(huán)WHILE循環(huán)環(huán)WHILE<布布爾爾表表達(dá)達(dá)式式>LOOP要執(zhí)執(zhí)行行的的語(yǔ)語(yǔ)句句;ENDLOOP;WHILE循環(huán)環(huán)實(shí)實(shí)例例DECLARExNUMBER:=1;BEGINWHILEx<=10LOOPDBMS_OUTPUT.PUT_LINE('X的當(dāng)前值為:'||x);x:=x+1;ENDLOOP;END;循環(huán)數(shù)字式循環(huán)每循環(huán)一次,,循環(huán)變量自自動(dòng)加1,使用關(guān)鍵字字REVERSE,循環(huán)變量自自動(dòng)減1。跟在INREVERSE后面的數(shù)字必必須是從小到到大的順序,,而且必須是是整數(shù),不能能是變量或表表達(dá)式。可以以使用EXIT退出循環(huán)。FOR循環(huán)環(huán)計(jì)數(shù)器IN[REVERSE]下下限..上上限LOOP要執(zhí)行的語(yǔ)句句;ENDLOOP;數(shù)字式循環(huán)實(shí)實(shí)例BEGINFORintin1..10LOOPDBMS_OUTPUT.PUT_LINE('int的的當(dāng)前值為為:'||int);ENDLOOP;END;數(shù)字式循環(huán)實(shí)實(shí)例CREATETABLEtemp_table(num_colNUMBER);DECLAREV_counterNUMBER:=10;BEGININSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterIN20..25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;INSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterINREVERSE20..25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;END;DROPTABLEtemp_table;GOTO和標(biāo)簽<<label>>標(biāo)號(hào)是用<<>>括起來(lái)的標(biāo)識(shí)識(shí)符GOTOlabel;GOTO和標(biāo)簽實(shí)例例DECLAREV_counterNUMBER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE('V_counter的當(dāng)前值為為:'||V_counter);V_counter:=v_counter+1;IFv_counter>10THENGOTOl_ENDofLOOP;ENDIF;ENDLOOP;<<l_ENDofLOOP>>DBMS_OUTPUT.PUT_LINE('V_counter的當(dāng)前前值為:'||V_counter);END;NULL語(yǔ)句DECLARE...BEGIN…IFv_numISNULLTHENGOTOprint1;ENDIF;…<<print1>>NULL;--不不需要要處理任任何數(shù)據(jù)據(jù)。END;游標(biāo)概念念為了處理理SQL語(yǔ)句獲取取一個(gè)表表中記錄錄,ORACLE提供一個(gè)個(gè)上下文文,它提提供了一一個(gè)指向向語(yǔ)句的的指針以以及查詢?cè)兊幕顒?dòng)動(dòng)集(activeset)。游標(biāo)是是一個(gè)指指向上下下文的句句柄(handle)或指針。。通過(guò)游游標(biāo),PL/SQL可以控制制上下文文區(qū)和處處理語(yǔ)句句時(shí)上下下文區(qū)會(huì)會(huì)發(fā)生些些什么事事情。游標(biāo)概念念對(duì)于不同同的SQL語(yǔ)句,游游標(biāo)的使使用情況況不同::處理顯式式游標(biāo)顯式游標(biāo)標(biāo)處理需需四個(gè)PL/SQL步驟::定義游標(biāo)標(biāo)格式:CURSORcursor_nameISselect_statement;打開(kāi)游標(biāo)標(biāo)格式:OPENcursor_name;提取游標(biāo)標(biāo)數(shù)據(jù)格式:FETCHcursor_nameINTO{variable_list|record_variable};關(guān)閉游標(biāo)標(biāo)格式:CLOSEcursor_name;示例1DECLARECURSORc_cursorISSELECTename,salFROMempWHERErownum<11;v_enameemp.ename%TYPE;v_salemp.sal%TYPE;BEGINOPENc_cursor;FETCHc_cursorINTOv_ename,v_sal;WHILEc_cursor%FOUNDLOOPDBMS_OUTPUT.PUT_LINE(v_ename||'---'|to_char(v_sal));FETCHc_cursorINTOv_ename,v_sal;ENDLOOP;CLOSEc_cursor;END;示例2DECLAREDeptRecdept%ROWTYPE;Dept_namedept.dname%TYPE;Dept_locdept.loc%TYPE;CURSORc1ISSELECTdname,locFROMdeptWHEREdeptno<=30;CURSORc2(dept_noNUMBERDEFAULT10)ISSELECTdname,locFROMdeptWHEREdeptno<=dept_no;CURSORc3(dept_noNUMBERDEFAULT10)ISSELECT*FROMdeptWHEREdeptno<=dept_no;BEGINOPENc1;LOOPFETCHc1INTOdept_name,dept_loc;EXITWHENc1%NOTFOUND;DBMS_OUTPUT.PUT_LINE(dept_name||'---'|dept_loc);ENDLOOP;示例2續(xù)…CLOSEc1;OPENc2;LOOPFETCHc2INTOdept_name,dept_loc;EXITWHENc2%NOTFOUND;DBMS_OUTPUT.PUT_LINE(dept_name||'---'|dept_loc);ENDLOOP;CLOSEc2;OPENc3(dept_no=>20);LOOPFETCHc3INTOdeptrec;EXITWHENc3%NOTFOUND;DBMS_OUTPUT.PUT_LINE(deptrec.deptno||'---'|deptrec.dname||'---'|deptrec.loc);ENDLOOP;CLOSEc3;END;游標(biāo)屬性性%FOUND布爾型屬屬性,當(dāng)當(dāng)最近一一次讀記記錄時(shí)成成功返回回,則值為TRUE;%NOTFOUND布爾型屬屬性,與與%FOUND相反;%ISOPEN布爾型屬屬性,當(dāng)當(dāng)游標(biāo)已已打開(kāi)時(shí)時(shí)返回TRUE;%ROWCOUNT數(shù)字型屬屬性,返返回已從從游標(biāo)中中讀取的的記錄數(shù)數(shù)。示例DECLAREv_empnoemp.empno%TYPE;v_salemp.sal%TYPE;CURSORc_cursorISSELECTempno,salFROMemp;BEGINOPENc_cursor;LOOPFETCHc_cursorINTOv_empno,v_sal;EXITWHENc_cursor%NOTFOUND;IFv_sal<=1200THENUPDATEempSETsal=sal+50WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'工資已更更新!');ENDIF;DBMS_OUTPUT.PUT_LINE('記錄數(shù):'||c_cursor%ROWCOUNT);ENDLOOP;CLOSEc_cursor;END;游標(biāo)的FOR循環(huán)FORindex_variableINcursor_name[value[,value]……]LOOP--游標(biāo)數(shù)據(jù)據(jù)處理代代碼ENDLOOP;游標(biāo)中使使用FOR循環(huán)示例例DECLARECURSORc_salISSELECTempno,ename,salFROMemp;BEGIN--隱含打開(kāi)開(kāi)游標(biāo)FORv_salINc_salLOOP--隱含執(zhí)行行一個(gè)FETCH語(yǔ)句DBMS_OUTPUT.PUT_LINE(to_char(v_sal.empno)||'---'||v_sal.ename||'---'||to_char(v_sal.sal));--隱含監(jiān)測(cè)測(cè)c_sal%NOTFOUNDENDLOOP;--隱含關(guān)閉閉游標(biāo)END;有參數(shù)游游標(biāo)中使使用FOR循環(huán)示例例DECLARECURSORc_cursor(dept_noNUMBERDEFAULT10)ISSELECTdname,locFROMdeptWHEREdeptno<=dept_no;BEGINDBMS_OUTPUT.PUT_LINE('dept_no參數(shù)值為為30:');FORc1_recINc_cursor(30)LOOP--c_cursor(dept_n=>30)DBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc);ENDLOOP;DBMS_OUTPUT.PUT_LINE(CHR(10)||'使用默認(rèn)認(rèn)的dept_no參數(shù)值10:');FORc1_recINc_cursorLOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc);ENDLOOP;END;游標(biāo)FOR循環(huán)語(yǔ)句句中使用用子查詢?cè)儊?lái)實(shí)現(xiàn)現(xiàn)游標(biāo)實(shí)實(shí)例例BEGINFORc1_recIN(SELECTdname,locFROMdept)LOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc);ENDLOOP;END;處理隱式式游標(biāo)當(dāng)查詢返返回結(jié)果果超過(guò)一一行時(shí),,就需要要一個(gè)顯顯式游標(biāo)標(biāo)。顯式式游標(biāo)主主要是用用于對(duì)查查詢語(yǔ)句句的處理理,尤其其是在查查詢結(jié)果果為多條條記錄的的情況下下;而對(duì)對(duì)于非查查詢語(yǔ)句句,如修修改、刪刪除操作作,則由由ORACLE系統(tǒng)自動(dòng)動(dòng)地為這這些操作作設(shè)置游游標(biāo)并創(chuàng)創(chuàng)建其工工作區(qū),,這些由由系統(tǒng)隱隱含創(chuàng)建建的游標(biāo)標(biāo)稱為隱隱式游標(biāo)標(biāo),隱式式游標(biāo)的的名字為為SQL,這是由由ORACLE系統(tǒng)定義義的。對(duì)對(duì)于隱式式游標(biāo)的的操作,,如定義義、打開(kāi)開(kāi)、取值值及關(guān)閉閉操作,,都由ORACLE系統(tǒng)自動(dòng)動(dòng)地完成成,無(wú)需需用戶進(jìn)進(jìn)行處理理。用戶戶只能通通過(guò)隱式式游標(biāo)的的相關(guān)屬屬性,來(lái)來(lái)完成相相應(yīng)的操操作。在在隱式游游標(biāo)的工工作區(qū)中中,所存存放的數(shù)數(shù)據(jù)是與與用戶自自定義的的顯示游游標(biāo)無(wú)關(guān)關(guān)的、最最新處理理的一條條SQL語(yǔ)句所包含的的數(shù)據(jù)。處理隱式游標(biāo)標(biāo)格式調(diào)用為::SQL%當(dāng)執(zhí)行一條DML語(yǔ)句后,DML語(yǔ)句的結(jié)果保保存在四個(gè)游游標(biāo)屬性中,,這些屬性用用于控制程序序流程或者了了解程序的狀狀態(tài)。當(dāng)運(yùn)行行DML語(yǔ)句時(shí),PL/SQL打開(kāi)一個(gè)內(nèi)建建游標(biāo)并處理理結(jié)果,游標(biāo)標(biāo)是維護(hù)查詢?cè)兘Y(jié)果的內(nèi)存存中的一個(gè)區(qū)區(qū)域,游標(biāo)在在運(yùn)行DML語(yǔ)句時(shí)打開(kāi),,完成后關(guān)閉閉。處理隱式游標(biāo)標(biāo)隱式游標(biāo)只使使用SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT三個(gè)屬性,SQL%FOUND,SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數(shù)值。處理隱式游標(biāo)標(biāo)SQL%FOUND,布爾型屬性性,當(dāng)最近一一次讀記錄時(shí)時(shí)成功返回,,則值為TRUE。在執(zhí)行任何何DML語(yǔ)句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執(zhí)行DML語(yǔ)句后,SQL%FOUND的屬性值將是是:INSERT為TRUE;DELETE和UPDATE,至少有一行行被DELETE或UPDATE為TRUE;SELECTINTO至少返回一行行為TRUE;SQL%FOUND為TRUE時(shí),SQL%NOTFOUND為FALSE。處理隱式游標(biāo)標(biāo)示例DECLAREV_deptnoemp.deptno%TYPE:=&p_deptno;BEGINDELETEFROMempWHEREdeptno=v_deptno;IFSQL%NOTFOUNDTHENDELETEFROMdeptWHEREdeptno=v_deptno;ENDIF;END;異常錯(cuò)誤處理理異常情況處理理是用來(lái)處理理正常執(zhí)行過(guò)過(guò)程中未預(yù)料料的事件,程程序塊的異常常處理預(yù)定義義的錯(cuò)誤和自自定義錯(cuò)誤,,由于PL/SQL程序塊一旦產(chǎn)產(chǎn)生異常而沒(méi)沒(méi)有指出如何何處理時(shí),程程序就會(huì)自動(dòng)動(dòng)終止整個(gè)程程序運(yùn)行。有三種類型的的異常:預(yù)定義(Predefined)異常ORACLE預(yù)定義的異常常情況大約有有24個(gè)。對(duì)這種異異常情況的處處理,無(wú)需在在程序中定義義,由ORACLE自動(dòng)將其引發(fā)發(fā)。非預(yù)定義(Predefined)異常即其他標(biāo)準(zhǔn)的的ORACLE錯(cuò)誤。對(duì)這種種異常情況的的處理,需要要用戶在程序序中定義,然然后由ORACLE自動(dòng)將其引發(fā)發(fā)。用戶定義(User_define)異常程序執(zhí)行過(guò)程程中,出現(xiàn)編編程人員認(rèn)為為的非正常情情況。對(duì)這種種異常情況的的處理,需要要用戶在程序序中定義,然然后顯式地在在程序中將其其引發(fā)。異常處理部分分結(jié)構(gòu)EXCEPTIONWHENfirst_exceptionTHEN<codetohandlefirstexception>WHENsecond_exceptionTHEN<codetohandlesecondexception>WHENOTHERSTHEN<codetohandleothersexception>END;預(yù)定義的異常常處理實(shí)例DECLAREv_empnoemp.empno%TYPE:=&empno;v_salemp.sal%TYPE;BEGINSELECTsalINTOv_salFROMempWHEREempno=v_empno;IFv_sal<=1500THENUPDATEempSETsal=sal+100WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已更更新!');ELSEDBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已經(jīng)經(jīng)超過(guò)規(guī)定值值!');ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫(kù)中沒(méi)有有編碼為'||v_empno||'的員工');WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE('程序運(yùn)行錯(cuò)誤誤!請(qǐng)使用游標(biāo)');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’’---‘||SQLERRM);END;非預(yù)定義的異異常處理非定義的ORACLE錯(cuò)誤進(jìn)行定義義,步驟如下下:1.在PL/SQL塊的定義部分分定義異常情情況:<異常情況>EXCEPTION;2.將其定義好的的異常情況,,與標(biāo)準(zhǔn)的ORACLE錯(cuò)誤聯(lián)系起來(lái)來(lái),使用EXCEPTION_INIT語(yǔ)句:PRAGMAEXCEPTION_INIT(<異常情況>,<錯(cuò)誤代碼>);3.在PL/SQL塊的異常情況況處理部分對(duì)對(duì)異常情況做做出相應(yīng)的處處理。示例INSERTINTOdeptVALUES(50,‘FINANCE’,‘CHICAGO’);DECLAREv_deptnodept.deptno%TYPE:=&deptno;deptno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);/*-2292是違反一致性性約束的錯(cuò)誤誤代碼*/BEGINDELETEFROMdeptWHEREdeptno=v_deptno;EXCEPTIONWHENdeptno_remainingTHENDBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整整性約束!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’’---‘||SQLERRM);END;存儲(chǔ)函數(shù)和過(guò)過(guò)程ORACLE提供可以把PL/SQL程序存儲(chǔ)在數(shù)數(shù)據(jù)庫(kù)中,并并可以在任何何地方來(lái)運(yùn)行行它。這樣就就叫存儲(chǔ)過(guò)程程或函數(shù)。過(guò)過(guò)程和函數(shù)統(tǒng)統(tǒng)稱為PL/SQL子程序,他們們是被命名的的PL/SQL塊,均存儲(chǔ)在在數(shù)據(jù)庫(kù)中,,并通過(guò)輸入入、輸出參數(shù)數(shù)或輸入/輸出參數(shù)與其其調(diào)用者交換換信息。過(guò)程程和函數(shù)的唯唯一區(qū)別是函函數(shù)總向調(diào)用用者返回?cái)?shù)據(jù)據(jù),而過(guò)程則則不返回?cái)?shù)據(jù)據(jù)。在本節(jié)中中主要介紹::創(chuàng)建存儲(chǔ)過(guò)程程和函數(shù);建立和管理存存儲(chǔ)過(guò)程和函函數(shù)。創(chuàng)建函數(shù)語(yǔ)法如下:CREATE[orREPLACE]FUNCTIONfunction_name[(argment[{in|inout}]TYPE,argment[{in|out|inout}]type]RETURNRETURN_type{IS|AS}BEGINFUNCTION_bodyEXCEPTION......ENDfunction_name;創(chuàng)建函數(shù)示示例CREATEORREPLACEFUNCTIONget_salary(Dept_noNUMBER,Emp_countOUTNUMBER)RETURNNUMBERISV_sumNUMBER;BEGINSELECTSUM(sal),count(*)INTOV_sum,emp_countFROMempWHEREdeptno=dept_no;RETURNv_sum;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDget_salary;函數(shù)的調(diào)用格式為:argument_value1[,argument_value2…]函數(shù)的調(diào)用實(shí)實(shí)例DECLAREV_numNUMBER;V_sumNUMBER;BEGINV_sum:=get_salary(30,v_num);DBMS_OUTPUT.PUT_LINE('30號(hào)部門工資總總和:'||v_sum||',人數(shù):'||v_num);END;運(yùn)行結(jié)果:30號(hào)部門工資總總和:9400,人數(shù):6創(chuàng)建過(guò)程創(chuàng)建過(guò)程語(yǔ)法法:CREATE[ORREPLACE]PROCEDUREProcedure_name[(argment[{IN|OUT|INOUT}]Type,argment[{IN|OUT|INOUT}]Type][AUTHIDDEFINER|CURRENT_USER]{IS|AS}<類型.變量的說(shuō)明>BEGIN<執(zhí)行部分>EXCEPTION<可選的異常錯(cuò)錯(cuò)誤處理程序序>END;實(shí)例1CREATEtablelogtable(useridVARCHAR2(10),logdatedate);CREATEORREPLACEPROCEDURElogexecutionISBEGININSERTINTOlogtable(userid,logdate)VALUES(USER,SYSDATE);END;實(shí)例2CREATEORREPLACEPROCEDUREDelEmp(v_empnoINemp.empno%TYPE)ASNo_resultEXCEPTION;BEGINDELETEFROMempWHEREempno=v_empno;IFSQL%NOTFOUNDTHENRAISEno_result;ENDIF;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'的員工已被除除名!');EXCEPTIONWHENno_resultTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDDelEmp;實(shí)例3CREATEORREPLACEPROCEDUREInsertEmp(v_empnoinemp.empno%TYPE,v_nameinemp.ename%TYPE,v_deptnoinemp.deptno%TYPE)ASempno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(empno_remaining,-1);/*-1是違反唯一約約束條件的錯(cuò)錯(cuò)誤代碼*/BEGININSERTINTOemp(empno,ename,hiredate,deptno)VALUES(v_empno,v_name,sysdate,v_deptno);DBMS_OUTPUT.PUT_LINE('插入數(shù)據(jù)記錄錄成功!');EXCEPTIONWHENempno_remainingTHENDBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整整性約束!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDInsertEmp;調(diào)用存儲(chǔ)過(guò)程程ORACLE使用EXECUTE語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)對(duì)存儲(chǔ)過(guò)程的的調(diào)用:EXEC[UTE]Procedure_name(parameter1,parameter2…);存儲(chǔ)過(guò)程和調(diào)調(diào)用實(shí)例1CREATEORREPLACEPROCEDUREQueryEmp(v_empnoINemp.empno%TYPE,v_enameOUTemp.ename%TYPE,v_salOUTemp.sal%TYPE)ASBEGINSELECTename,salINTOv_ename,v_salFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'的員工已經(jīng)查查到!');EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)據(jù)據(jù)不存在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDQueryEmp;實(shí)例2DECLAREv1emp.ename%TYPE;v2emp.sal%TYPE;BEGINQueryEmp(7788,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名:'||v1);DBMS_OUTPUT.PUT_LINE('工資:'||v2);QueryEmp(7902,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名名:'||v1);DBMS_OUTPUT.PUT_LINE('工資資:'||v2);QueryEmp(8899,v1,v2);DBMS_OUTPUT.PUT_LINE('姓名名:'||v1);DBMS_OUTPUT.PUT_LINE('工資資:'||v2);END;運(yùn)行行結(jié)結(jié)果果::編碼碼為為7788的員員工工已已經(jīng)經(jīng)查查到到!姓名名:SCOTT工資資:3000編碼碼為為7902的員員工工已已經(jīng)經(jīng)查查到到!姓名名:FORD工資資:3000你需需要要的的數(shù)數(shù)據(jù)據(jù)不不存存在在!姓名名:工資資:實(shí)例例3CREATEORREPLACEPROCEDUREproc_demo(Dept_noNUMBERDEFAULT10,Sal_sumOUTNUMBER,Emp_countOUTNUMBER)ISBEGINSELECTSUM(sal),COUNT(*)INTOsal_sum,emp_countFROMempWHEREdeptno=dept_no;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需需要要的的數(shù)數(shù)據(jù)據(jù)不不存存在在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’’---‘‘||SQLERRM);ENDproc_demo;實(shí)例例4DECLAREV_numNUMBER;V_sumNUMBER(8,2);BEGINProc_demo(30,v_sum,v_num);DBMS_OUTPUT.PUT_LINE('30號(hào)部部門門工工資資總總和和::'||v_sum||',人數(shù)數(shù)::'||v_num);Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號(hào)部部門門工工資資總總和和::'||v_sum||',人數(shù)數(shù)::'||v_num);END;運(yùn)行行結(jié)結(jié)果果::30號(hào)部部門門工工資資總總和和::9400,人數(shù)數(shù)::610號(hào)部部門門工工資資總總和和::8750,人數(shù)數(shù)::3實(shí)例例5DECLAREV_numNUMBER;V_sumNUMBER(8,2);PROCEDUREproc_demo(Dept_noNUMBERDEFAULT10,Sal_sumOUTNUMBER,Emp_countOUTNUMBER)ISBEGINSELECTSUM(sal),COUNT(*)INTOsal_sum,emp_countFROMempWHEREdeptno=dept_no;EXCEPTION實(shí)例例5續(xù)…WHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需需要要的的數(shù)數(shù)據(jù)據(jù)不不存存在在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDproc_demo;BEGINProc_demo(30,v_sum,v_num);DBMS_OUTPUT.PUT_LINE('30號(hào)部部門門工工資資總總和和::'||v_sum||',人人數(shù)數(shù)::'||v_num);Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號(hào)部部門門工工資資總總和和::'||v_sum||',人人數(shù)數(shù)::'||v_num);END;運(yùn)行行結(jié)結(jié)果果::30號(hào)部部門門工工資資總總和和::9400,人數(shù)::610號(hào)部門門工資資總和和:8750,人數(shù)::3刪除過(guò)過(guò)程和和函數(shù)數(shù)刪除過(guò)過(guò)程:語(yǔ)法如如下::DROPPROCEDURE[user.]Procudure_name;刪除函函數(shù):語(yǔ)法如如下::DROPFUNCTION[user.]Function_name;包的創(chuàng)創(chuàng)建和和應(yīng)用用一個(gè)包包由兩兩個(gè)分分開(kāi)的的部分分組成成:包定義義(PACKAGE):包包定義義部分分聲明明包內(nèi)內(nèi)數(shù)據(jù)據(jù)類型型、變變量、、常量量、游游標(biāo)、、子程程序和和異常常錯(cuò)誤誤處理理等元元素,,這些些元素素為包包的公公有元元素。。包主體體(PACKAGEBODY):包包主體體則是是包定定義部部分的的具體體實(shí)現(xiàn)現(xiàn),它它定義義了包包定義義部分分所聲聲明的的游標(biāo)標(biāo)和子子程序序,在在包主主體中中還可可以聲聲明包包的私私有元元素。。包定義義和包包主體體分開(kāi)開(kāi)編譯譯,并并作為為兩部部分分分開(kāi)的的對(duì)象象存放放在數(shù)數(shù)據(jù)庫(kù)庫(kù)字典典中,,詳見(jiàn)見(jiàn)數(shù)據(jù)據(jù)字典典user_source,all_source,dba_source.包的定定義創(chuàng)建包包定義義:CREATE[ORREPLACE]PACKAGEpackage_name[AUTHID{CURRENT_USER|DEFINER}]{IS|AS}[公有數(shù)數(shù)據(jù)類類型定定義[公有數(shù)數(shù)據(jù)類類型定定義]…][公有游游標(biāo)聲聲明[公有游游標(biāo)聲聲明]…][公有變變量、、常量量聲明明[公有變變量、、常量量聲明明]…][公有子子程序序聲明明[公有子子程序序聲明明]…]END[package_name];包的定定義創(chuàng)建包包主體體:CREATE[ORREPLACE]PACKAGEBODYpackage_name{IS|AS}[私有數(shù)數(shù)據(jù)類類型定定義[私有數(shù)數(shù)據(jù)類類型定定義]…][私有變變量、、常量量聲明明[私有變變量、、常量量聲明明]…][私有子子程序序聲明明和定定義[私有子子程序序聲明明和定定義]…][公有游游標(biāo)定定義[公有游游標(biāo)定定義]…][公有子子程序序定義義[公有子子程序序定義義]…]BEGINPL/SQL語(yǔ)句END[package_name];包的開(kāi)開(kāi)發(fā)步步驟與開(kāi)發(fā)發(fā)存儲(chǔ)儲(chǔ)過(guò)程程類似似,包包的開(kāi)開(kāi)發(fā)需需要幾幾個(gè)步步驟::將每個(gè)個(gè)存儲(chǔ)儲(chǔ)過(guò)程程調(diào)式式正確確;用文本本編輯輯軟件件將各各個(gè)存存儲(chǔ)過(guò)過(guò)程和和函數(shù)數(shù)集成成在一一起;;按照包包的定定義要要求將將集成成的文文本的的前面面加上上包定定義;;按照包包的定定義要要求將將集成成的文文本的的前面面加上上包主主體;;使用SQLPLUS或開(kāi)發(fā)發(fā)工具具進(jìn)行行調(diào)式式。創(chuàng)建包包實(shí)實(shí)例CREATEORREPLACEPACKAGEdemo_packISDeptRecdept%ROWTYPE;FUNCTIONadd_dept(dept_noNUMBER,dept_nameVARCHAR2,locationVARCHAR2)RETURNNUMBER;FUNCTIONremove_dept(dept_noNUMBER)RETURNNUMBER;PROCEDUREquery_dept(dept_noINNUMBER);ENDdemo_pack;創(chuàng)建包包體實(shí)實(shí)例例CREATEORREPLACEPACKAGEBODYdemo_packISFUNCTIONadd_dept(dept_noNUMBER,dept_nameVARCHAR2,locationVARCHAR2)RETURNNUMBERISempno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(empno_remaining,-1);/*-1是違反反唯一一約束束條件件的錯(cuò)錯(cuò)誤代代碼*/BEGININSERTINTOdeptVALUES(dept_no,dept_name,location);IFSQL%FOUNDTHENRETURN1;ENDIF;EXCEPTIONWHENempno_remainingTHENRETURN0;WHENOTHERSTHENRETURN-1;ENDadd_dept;創(chuàng)建包包體實(shí)實(shí)例例續(xù)續(xù)…FUNCTIONremove_dept(dept_noNUMBER)RETURNNUMBERISBEGINDELETEFROMdeptWHEREdeptno=dept_no;IFSQL%FOUNDTHENRETURN1;ELSERETURN0;ENDIF;EXCEPTIONWHENOTHERSTHENRETURN-1;ENDremove_dept;創(chuàng)建
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初二學(xué)期個(gè)人總結(jié)(10篇)
- 2024年度石油化工設(shè)備安裝工程合同
- 2024年廣告投放與代理合作協(xié)議
- 公司部門月工作總結(jié)(3篇)
- 2024年掛靠方與被掛靠方合同
- 2024年快遞業(yè)務(wù)價(jià)格調(diào)整合同
- 2024年房產(chǎn)清償債務(wù)協(xié)議
- 2024年度品牌授權(quán)使用合同標(biāo)的及屬性
- 《基于知識(shí)重用的小型立體冷庫(kù)快速設(shè)計(jì)研究》
- 《難熔高熵合金組織結(jié)構(gòu)與力學(xué)性能研究》
- 新產(chǎn)品試制流程管理辦法
- 通用橫版企業(yè)報(bào)價(jià)單模板
- 潛油泵及潛油泵加油機(jī)講義
- 物業(yè)服務(wù)公司各崗位規(guī)范用語(yǔ)
- 醫(yī)患溝通內(nèi)容要求記錄模板(入院、入院三日、術(shù)前、術(shù)后、出院)
- 航海學(xué)天文定位第四篇第6章天文定位
- 淺談深度教學(xué)中小學(xué)數(shù)學(xué)U型學(xué)習(xí)模式
- 物理電學(xué)暗箱專題30道
- 裝修公司員工勞動(dòng)合同
- 江西上饒鉛山汽車駕駛科目三考試線路
- 通過(guò)一起放火案件淺析放火案件的移交工作
評(píng)論
0/150
提交評(píng)論