Oracleg數(shù)據(jù)庫管理系統(tǒng)_第1頁
Oracleg數(shù)據(jù)庫管理系統(tǒng)_第2頁
Oracleg數(shù)據(jù)庫管理系統(tǒng)_第3頁
Oracleg數(shù)據(jù)庫管理系統(tǒng)_第4頁
Oracleg數(shù)據(jù)庫管理系統(tǒng)_第5頁
已閱讀5頁,還剩138頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí)用數(shù)據(jù)庫技術(shù)

Oracle10g數(shù)據(jù)庫管理系統(tǒng)學(xué)習(xí)內(nèi)容Oracle概述Oracle10g數(shù)據(jù)庫安裝Oracle10g數(shù)據(jù)庫卸載Oracle10g常用管理工具Oracle10g表管理使用過程和觸發(fā)器Oracle概述Oracle公司Oracle數(shù)據(jù)庫Oracle10g數(shù)據(jù)庫安裝服務(wù)器安裝需求版本企業(yè)版標(biāo)準(zhǔn)版?zhèn)€人版最低配置

CPU:Pentium166

內(nèi)存:128MB

硬盤空間:企業(yè)版(1.76GB):標(biāo)準(zhǔn)版(1.76GB):個人版(1.72GB)

視頻:256色Oracle10g數(shù)據(jù)庫安裝客戶端安裝需求安裝類型管理者(administrator)運(yùn)行時環(huán)境(runtime)自定義(custom)最低配置

CPU:Pentium166

內(nèi)存:128MB

硬盤空間:管理者(647MB):運(yùn)行時環(huán)境(486MB)

Oracle10g數(shù)據(jù)庫安裝過程(略)Oracle數(shù)據(jù)庫卸載1、停止服務(wù)2、卸載Oracle產(chǎn)品3、清理注冊表4、清理環(huán)境變量5、清理磁盤Oracle卸載1/5開始->設(shè)置->控制面板->管理工具->服務(wù)停止所有Oracle服務(wù)Oracle卸載2/5開始->程序->OracleInstallationProducts->UniversalInstaller卸裝所有Oracle產(chǎn)品,但UniversalInstaller本身不能被刪除Oracle卸載3/5運(yùn)行regeditHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services滾動這個列表,刪除所有Oracle入口。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,除所有Oracle入口。Oracle卸載4/5開始->設(shè)置置->控制面面板->系統(tǒng)統(tǒng)->高級-->環(huán)境變量量刪除環(huán)境變量量CLASSPATH和PATH中有關(guān)Oracle的設(shè)定Oracle卸載5/5從桌面上、STARTUP(啟動)組、、程序菜單中中,刪除所有有有關(guān)Oracle的組和圖標(biāo)刪除\ProgramFiles\Oracle目錄重新啟動計(jì)算算機(jī),重起后后才能完全刪刪除Oracle所在目錄,刪除與Oracle有關(guān)的文件,,選擇Oracle所在的缺省目目錄C:\Oracle,刪除這個入入

口目錄錄及所有子目目錄,并從Windows2000目錄(一般為為C:\WINNT)下刪除以下下文件ORACLE.INI、oraodbc.ini等等。Oracle10g常用管理工具具OEM控制臺SQL*PLUS工具介紹Oracle10g表管理在Oracle中建表,主要要有兩種方式式:一種是在SQL*PLUS中執(zhí)行建表的的SQL語句。另一種是通過過OEM工具。Oracle10g數(shù)據(jù)中的數(shù)據(jù)據(jù)類型數(shù)據(jù)類型類型說明CHAR字符型,最長為2000BNCHAR基于字符集的字符型,同上VARCHAR2變長字符型,最長為4000BNVARCHAR2基于字符集的變長字符型,同上VARCHAR同VARCHAR2LONG變長字符型,最長為2GBNUMBER(s,d)數(shù)字型,總位數(shù)為s位,小數(shù)位為d位,總長最大為38位DATE日期型RAW純二進(jìn)制數(shù)據(jù)類型,最長為2000BLONGRAW變長二進(jìn)制數(shù)據(jù)類型,最長為2GBBLOB二進(jìn)制大對象類型,最長為4GBNLOB包含定寬的多位數(shù)字符的字符大對象類型,最長為4GBCLOB包含單個字符的字符大對象類型,最長為4GBBFILE數(shù)據(jù)庫外的大型二進(jìn)制文件的輸入指示器類型,最大為4GBPL/SQL語言基礎(chǔ)注釋變量聲明運(yùn)算符PL/SQL塊結(jié)構(gòu)控制語句PL/SQL程序設(shè)計(jì)簡介介PL/SQL是一種高級數(shù)數(shù)據(jù)庫程序設(shè)設(shè)計(jì)語言,該該語言專門用用于在各種環(huán)環(huán)境下對ORACLE數(shù)據(jù)庫進(jìn)行訪訪問。由于該該語言集成于于數(shù)據(jù)庫服務(wù)務(wù)器中,所以以PL/SQL代碼可以對數(shù)數(shù)據(jù)進(jìn)行快速速高效的處理理。除此之外外,可以在ORACLE數(shù)據(jù)庫的某些些客戶端工具具中,使用PL/SQL語言也是該語語言的一個特特點(diǎn)。SQL與PL/SQLPL/SQL是ProcedureLanguage&StructuredQueryLanguage的縮寫。ORACLE的SQL是支持ANSI(AmericannationalStandardsInstitute)和ISO92(InternationalStandardsOrganization)標(biāo)準(zhǔn)的產(chǎn)品。。PL/SQL是對SQL語言存儲過程程語言的擴(kuò)展展。為什么使用PL/SQL有利于客戶/服務(wù)器環(huán)境應(yīng)應(yīng)用的運(yùn)行適合于客戶環(huán)環(huán)境PL/SQL塊結(jié)構(gòu)PL/SQL程序由三個塊塊組成,即聲聲明部分、執(zhí)執(zhí)行部分、異異常處理部分分。DECLARE/*聲明部分:在此聲明PL/SQL用到的變量,類型及游標(biāo),,以及局部的的存儲過程和和函數(shù)*/BEGIN/*執(zhí)行部分:過程及SQL語句,即程序的主要要部分*/EXCEPTION/*執(zhí)行異常部分分:錯誤處理*/END;PL/SQL塊可以分為三三類無名塊:動態(tài)態(tài)構(gòu)造,只能能執(zhí)行一次。。子程序:存儲儲在數(shù)據(jù)庫中中的存儲過程程、函數(shù)及包包等。當(dāng)在數(shù)數(shù)據(jù)庫上建立立好后可以在在其它程序中中調(diào)用它們。。觸發(fā)器:當(dāng)數(shù)數(shù)據(jù)庫發(fā)生操操作時,會觸觸發(fā)一些事件件,從而自動動執(zhí)行相應(yīng)的的程序。標(biāo)識符PL/SQL程序設(shè)計(jì)中的的標(biāo)識符定義義與SQL的標(biāo)識符定義義的要求相同同。要求和限限制有:標(biāo)識符名不能能超過30字符;第一個字符必必須為字母;;不分大小寫;;不能用’-‘(減號);不能是SQL保留字。實(shí)例下面的例子將將會刪除所有有的紀(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í)實(shí)例其中,,RETURNING子句用用于檢檢索INSERT語句中中所影影響的的數(shù)據(jù)據(jù)行數(shù)數(shù),當(dāng)當(dāng)INSERT語句使使用VALUES子句插插入數(shù)數(shù)據(jù)時時,RETURNING子句還還可將將列表表達(dá)式式、ROWID和REF值返回回到輸輸出變變量中中。在在使用用RETURNING子句是是應(yīng)注注意以以下幾幾點(diǎn)限限制::不能并并行DML語句;;不能檢檢索LONG類型信信息;;當(dāng)通過過視圖圖向基基表中中插入入數(shù)據(jù)據(jù)時,,只能能與單單基表表視圖圖一起起使用用。PL/SQL變量類類型實(shí)實(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í)實(shí)例其中,,RETURNING子句用用于檢檢索被被修改改行信信息,,當(dāng)UPDATE語句修修改單單行數(shù)數(shù)據(jù)時時,RETURNING子句可可以檢檢索被被修改改行的的ROWID值,以以及行行中被被修改改列的的列表表達(dá)式式,并并可將將他們們存儲儲到PL/SQL變量或或復(fù)合合變量量中;;當(dāng)UPDATE語句修修改多多行數(shù)數(shù)據(jù)時時,RETURNING子句可可以將將被修修改行行的ROWID值,以以及列列表達(dá)達(dá)式值值返回回到復(fù)復(fù)合變變量數(shù)數(shù)組中中。在在UPDATE中使用用RETURNING子句的的限制制與INSERT語句中中對RETURNING子句的的限制制相同同。PL/SQL變量類類型實(shí)實(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í)實(shí)例RETURNING子句用用于檢檢索被被刪除除行信信息,,當(dāng)DELETE語句修修改單單行數(shù)數(shù)據(jù)時時,RETURNING子句可可以檢檢索被被刪除除行的的ROWID,以及及被刪刪除行行中列列的列列表達(dá)達(dá)式,,并可可將他他們存存儲到到PL/SQL變量或或復(fù)合合變量量中;;當(dāng)UPDATE語句修修改多多行數(shù)數(shù)據(jù)時時,RETURNING子句可可以將將被修修改行行的ROWID,以及及列表表達(dá)式式值返返回到到復(fù)合合變量量數(shù)組組中。。在UPDATE中使用用RETURNING子句的的限制制與INSERT語句中中對RETURNING子句的的限制制相同同。。復(fù)合類類型ORACLE在PL/SQL中除了了提供供象前前面介介紹的的各種種類型型外,,還提提供一一種稱稱為復(fù)復(fù)合類類型的的類型型---記錄和和表。。記錄類類型使用%TYPE使用%ROWTYPE記錄類類型記錄類類型是是把邏邏輯相相關(guān)的的數(shù)據(jù)據(jù)作為為一個個單元元存儲儲起來來,它它必須須包括括至少少一個個標(biāo)量量型((數(shù)字字型、、字符符型、、布爾爾型、、日期期型))或RECORD數(shù)據(jù)類類型的的成員員,稱稱作PL/SQLRECORD的域(FIELD),其作作用是是存放放互不不相同同但邏邏輯相相關(guān)的的信息息。定義記記錄類類型語語法如如下: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定義一一個變變量,,其數(shù)數(shù)據(jù)類類型與與已經(jīng)經(jīng)定義義的某某個數(shù)數(shù)據(jù)變變量的的類型型相同同,或或者與與數(shù)據(jù)據(jù)庫表表的某某個列列的數(shù)數(shù)據(jù)類類型相相同,,這時時可以以使用用%TYPE。使用%TYPE特性的的優(yōu)點(diǎn)點(diǎn)在于于:所引用的數(shù)數(shù)據(jù)庫列的的數(shù)據(jù)類型型可以不必必知道;所引用的數(shù)數(shù)據(jù)庫列的的數(shù)據(jù)類型型可以實(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操作符,返回一個記記錄類型,,其數(shù)據(jù)類類型和數(shù)據(jù)據(jù)庫表的數(shù)數(shù)據(jù)結(jié)構(gòu)相相一致。使用%ROWTYPE特性的優(yōu)點(diǎn)點(diǎn)在于:所引用的數(shù)數(shù)據(jù)庫中列列的個數(shù)和和數(shù)據(jù)類型型可以不必必知道;所引用的數(shù)數(shù)據(jù)庫中列列的個數(shù)和和數(shù)據(jù)類型型可以實(shí)時時改變。實(shí)例DECLAREv_empnoemp.empno%TYPE:=&no;recemp%ROWTYPE;BEGINSELECT*INTOrecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工工資:'||rec.sal||'工工作時間:'||rec.hiredate);END;運(yùn)算符和表表達(dá)式算術(shù)運(yùn)算符符運(yùn)算符和表表達(dá)式關(guān)系運(yùn)算符符運(yùn)算符和表表達(dá)式邏輯運(yùn)算符符變量賦值在PL/SQL編程中,變變量賦值是是一個值得得注意的地地方,它的的語法如下下:variable是一個PL/SQL變量,expression是一個PL/SQL表達(dá)式。variable:=expression;字符及數(shù)字字運(yùn)算特點(diǎn)點(diǎn)空值加數(shù)字字仍是空值值:NULL+<數(shù)字>=NULL空值加(連連接)字符符,結(jié)果為為字符:NULL||<字符串>=<字符串>BOOLEAN賦值布爾值只有有TRUE,FALSE及NULL三個值。如如:DECLAREdoneBOOLEAN;/*thefollowingstatementsarelegal:*/BEGINdone:=FALSE;WHILENOTdoneLOOPNull;ENDLOOP;END;游標(biāo)賦值游標(biāo)賦值是是通過SELECT語句來完成成的,每次次執(zhí)行SELECT語句就賦值值一次,一一般要求被被賦值的變變量與SELECT中的列名要要一一對應(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ù)來完成成字符到數(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í)現(xiàn)日日期到字字符的轉(zhuǎn)轉(zhuǎn)換,如如:v_to_day:=TO_CHAR(SYSDATE,'yyyy.mm.ddhh24:mi:ss');變量作用用范圍及及可見性性PL/SQL的變量作作用范圍圍特點(diǎn)是是:變量的作作用范圍圍是在你你所引用用的程序序單元((塊、子子程序、、包)內(nèi)內(nèi)。即從從聲明變變量開始始到該塊塊的結(jié)束束。一個變量量(標(biāo)識識)只能能在你所所引用的的塊內(nèi)是是可見的的。當(dāng)一個變變量超出出了作用用范圍,,PL/SQL引擎就釋釋放用來來存放該該變量的的空間((因?yàn)樗赡懿徊挥昧耍?。在子塊中中重新定定義該變變量后,,它的作作用僅在在該塊內(nèi)內(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里,可以以使用兩兩種符號號來寫注注釋,即即:使用雙‘‘-‘(減號)加注釋V_SalNUMBER(12,2);--工資變量量。使用/**/來加一行行或多行行注釋/***********************************************//*文件名::department_salary.sql*//***********************************************/示例簡簡單數(shù)據(jù)據(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;示例簡簡單數(shù)據(jù)據(jù)刪除例例子DECLAREv_empnonumber(4):=8888;BEGINDELETEFROMempWHEREempno=v_empno;COMMIT;END;PL/SQL流程控制制語句PL/SQL的流程控控制語句句包括如如下三類類:控制語句句:IF語句;循環(huán)語句句:LOOP語句,EXIT語句;順序語句句:GOTO語句,NULL語句。條件語句句IF<布爾表達(dá)達(dá)式>THENPL/SQL和SQL語句ENDIF;IF<布爾表達(dá)達(dá)式>THENPL/SQL和SQL語句ELSE其它語句句ENDIF;條件語句句IF<布爾表達(dá)達(dá)式>THENPL/SQL和SQL語句ELSIF<其它布爾爾表達(dá)式式>THEN其它語句句ELSIF<其它布爾爾表達(dá)式式>THEN其它語句句ELSE其它語句句ENDIF;條件語句句實(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á)式CASEselectorWHENexpression1THENresult1WHENexpression2THENresult2WHENexpressionNTHENresultN[ELSEresultN+1]END;CASE表達(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á)式實(shí)實(shí)例代碼運(yùn)行行結(jié)果::Entervalueforp_grade:Aold2:V_gradechar(1):=UPPER('&p_grade');new2:V_gradechar(1):=UPPER('A');Grade:AAppraisal:Excellent循環(huán)簡單循環(huán)環(huán)LOOP要執(zhí)行的的語句;EXITWHEN<條件語句句>/*條件滿足足,退出出循環(huán)語語句*/ENDLOOP;LOOP循環(huán)實(shí)實(shí)例DECLAREintNUMBER(2):=0;BEGINLOOPint:=int+1;DBMS_OUTPUT.PUT_LINE('int的當(dāng)前值值為:'||int);EXITWHENint=10;ENDLOOP;END;循環(huán)WHILE循環(huán)WHILE<布爾表表達(dá)式>LOOP要執(zhí)行的的語句;ENDLOOP;WHILE循環(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)變量自自動加1,使用關(guān)鍵字字REVERSE,循環(huán)變量自自動減1。跟在INREVERSE后面的數(shù)字必必須是從小到到大的順序,,而且必須是是整數(shù),不能能是變量或表表達(dá)式??梢砸允褂肊XIT退出循環(huán)。FOR循環(huán)環(huán)計(jì)數(shù)器IN[REVERSE]下下限..上上限LOOP要執(zhí)行的語句句;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)號是用<<>>括起來的標(biāo)識識符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語句DECLARE...BEGIN…IFv_numISNULLTHENGOTOprint1;ENDIF;…<<print1>>NULL;--不不需要處理任任何數(shù)據(jù)。END;游標(biāo)概念為了處理SQL語句獲取一個個表中記錄,,ORACLE提供一個上下下文,它提供供了一個指向向語句的指針針以及查詢的的活動集(activeset)。游標(biāo)是一個個指向上下文文的句柄(handle)或指針。通過過游標(biāo),PL/SQL可以控制上下下文區(qū)和處理理語句時上下下文區(qū)會發(fā)生生些什么事情情。游標(biāo)概念對于不同的SQL語句,游標(biāo)的的使用情況不不同:處理顯式游標(biāo)標(biāo)顯式游標(biāo)處理理需四個PL/SQL步驟:定義游標(biāo)格式:CURSORcursor_nameISselect_statement;打開游標(biāo)格式:OPENcursor_name;提取游標(biāo)數(shù)據(jù)據(jù)格式:FETCHcursor_nameINTO{variable_list|record_variable};關(guān)閉游標(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)最近一次次讀記錄時成成功返回,則值為TRUE;%NOTFOUND布爾型屬性,,與%FOUND相反;%ISOPEN布爾型屬性,,當(dāng)游標(biāo)已打打開時返回TRUE;%ROWCOUNT數(shù)字型屬性,,返回已從游游標(biāo)中讀取的的記錄數(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ù)處理理代碼ENDLOOP;游標(biāo)中使用FOR循環(huán)示例DECLARECURSORc_salISSELECTempno,ename,salFROMemp;BEGIN--隱含打開游標(biāo)標(biāo)FORv_salINc_salLOOP--隱含執(zhí)行一個個FETCH語句DBMS_OUTPUT.PUT_LINE(to_char(v_sal.empno)||'---'||v_sal.ename||'---'||to_char(v_sal.sal));--隱含監(jiān)測c_sal%NOTFOUNDENDLOOP;--隱含關(guān)閉游標(biāo)標(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)的dept_no參數(shù)值10:');FORc1_recINc_cursorLOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname||'---'||c1_rec.loc);ENDLOOP;END;游標(biāo)FOR循環(huán)語句中使使用子查詢來來實(shí)現(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é)果超過過一行時,,就需要一一個顯式游游標(biāo)。顯式式游標(biāo)主要要是用于對對查詢語句句的處理,,尤其是在在查詢結(jié)果果為多條記記錄的情況況下;而對對于非查詢詢語句,如如修改、刪刪除操作,,則由ORACLE系統(tǒng)自動地地為這些操操作設(shè)置游游標(biāo)并創(chuàng)建建其工作區(qū)區(qū),這些由由系統(tǒng)隱含含創(chuàng)建的游游標(biāo)稱為隱隱式游標(biāo),,隱式游標(biāo)標(biāo)的名字為為SQL,這是由ORACLE系統(tǒng)定義的的。對于隱隱式游標(biāo)的的操作,如如定義、打打開、取值值及關(guān)閉操操作,都由由ORACLE系統(tǒng)自動地地完成,無無需用戶進(jìn)進(jìn)行處理。。用戶只能能通過隱式式游標(biāo)的相相關(guān)屬性,,來完成相相應(yīng)的操作作。在隱式式游標(biāo)的工工作區(qū)中,,所存放的的數(shù)據(jù)是與與用戶自定定義的顯示示游標(biāo)無關(guān)關(guān)的、最新新處理的一一條SQL語句所包含含的數(shù)據(jù)。。處理隱式游游標(biāo)格式調(diào)用為為:SQL%當(dāng)執(zhí)行一條條DML語句后,DML語句的結(jié)果果保存在四四個游標(biāo)屬屬性中,這這些屬性用用于控制程程序流程或或者了解程程序的狀態(tài)態(tài)。當(dāng)運(yùn)行行DML語句時,PL/SQL打開一個內(nèi)內(nèi)建游標(biāo)并并處理結(jié)果果,游標(biāo)是是維護(hù)查詢詢結(jié)果的內(nèi)內(nèi)存中的一一個區(qū)域,,游標(biāo)在運(yùn)運(yùn)行DML語句時打開開,完成后后關(guān)閉。處理隱式游游標(biāo)隱式游標(biāo)只只使用SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT三個屬性,,SQL%FOUND,SQL%NOTFOUND是布爾值,,SQL%ROWCOUNT是整數(shù)值。。處理隱式游游標(biāo)SQL%FOUND,布爾型屬屬性,當(dāng)最最近一次讀讀記錄時成成功返回,,則值為TRUE。在執(zhí)行任任何DML語句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執(zhí)行DML語句后,SQL%FOUND的屬性值將將是:INSERT為TRUE;DELETE和UPDATE,至少有一一行被DELETE或UPDATE為TRUE;SELECTINTO至少返回一一行為TRUE;SQL%FOUND為TRUE時,SQL%NOTFOUND為FALSE。處理隱式游游標(biāo)示例例DECLAREV_deptnoemp.deptno%TYPE:=&p_deptno;BEGINDELETEFROMempWHEREdeptno=v_deptno;IFSQL%NOTFOUNDTHENDELETEFROMdeptWHEREdeptno=v_deptno;ENDIF;END;異常錯誤處處理異常情況處處理是用來來處理正常常執(zhí)行過程程中未預(yù)料料的事件,,程序塊的的異常處理理預(yù)定義的的錯誤和自自定義錯誤誤,由于PL/SQL程序塊一旦旦產(chǎn)生異常常而沒有指指出如何處處理時,程程序就會自自動終止整整個程序運(yùn)運(yùn)行。有三種類型型的異常::預(yù)定義(Predefined)異常ORACLE預(yù)定義的異異常情況大大約有24個。對這種種異常情況況的處理,,無需在程程序中定義義,由ORACLE自動將其引引發(fā)。非預(yù)定義(Predefined)異常即其他標(biāo)準(zhǔn)準(zhǔn)的ORACLE錯誤。對這這種異常情情況的處理理,需要用用戶在程序序中定義,,然后由ORACLE自動將其引引發(fā)。用戶定義(User_define)異常程序執(zhí)行過過程中,出出現(xiàn)編程人人員認(rèn)為的的非正常情情況。對這這種異常情情況的處理理,需要用用戶在程序序中定義,,然后顯式式地在程序序中將其引引發(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)超過規(guī)規(guī)定值!');ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫中沒沒有編碼為為'||v_empno||'的員工');WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE('程序運(yùn)行錯錯誤!請使用游標(biāo)標(biāo)');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);END;非預(yù)定義的的異常處理理非定義的ORACLE錯誤進(jìn)行定定義,步驟驟如下:1.在PL/SQL塊的定義部部分定義異異常情況::<異常情況>EXCEPTION;2.將其定義好好的異常情情況,與標(biāo)標(biāo)準(zhǔn)的ORACLE錯誤聯(lián)系起起來,使用用EXCEPTION_INIT語句:PRAGMAEXCEPTION_INIT(<異常情況>,<錯誤代碼>);3.在PL/SQL塊的異常情情況處理部部分對異常常情況做出出相應(yīng)的處處理。示例INSERTINTOdeptVALUES(50,‘‘FINANCE’’,‘CHICAGO’);DECLAREv_deptnodept.deptno%TYPE:=&deptno;deptno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);/*-2292是違反一致致性約束的的錯誤代碼碼*/BEGINDELETEFROMdeptWHEREdeptno=v_deptno;EXCEPTIONWHENdeptno_remainingTHENDBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完完整性約束束!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||’---‘||SQLERRM);END;存儲函數(shù)和和過程ORACLE提供可以把把PL/SQL程序存儲在在數(shù)據(jù)庫中中,并可以以在任何地地方來運(yùn)行行它。這樣樣就叫存儲儲過程或函函數(shù)。過程程和函數(shù)統(tǒng)統(tǒng)稱為PL/SQL子程序,他他們是被命命名的PL/SQL塊,均存儲儲在數(shù)據(jù)庫庫中,并通通過輸入、、輸出參數(shù)數(shù)或輸入/輸出參數(shù)與與其調(diào)用者者交換信息息。過程和和函數(shù)的唯唯一區(qū)別是是函數(shù)總向向調(diào)用者返返回數(shù)據(jù),,而過程則則不返回數(shù)數(shù)據(jù)。在本本節(jié)中主要要介紹:創(chuàng)建存儲過過程和函數(shù)數(shù);建立和管理理存儲過程程和函數(shù)。。創(chuàng)建函數(shù)語法如下::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ù)數(shù)據(jù)不存在在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDget_salary;函數(shù)的調(diào)用用格式為:argument_value1[,argument_value2……]函數(shù)的調(diào)用用實(shí)例DECLAREV_numNUMBER;V_sumNUMBER;BEGINV_sum:=get_salary(30,v_num);DBMS_OUTPUT.PUT_LINE('30號部門工資資總和:'||v_sum||',人數(shù):'||v_num);END;運(yùn)行結(jié)果::30號部門工資資總和:9400,人數(shù):6創(chuàng)建過程創(chuàng)建過程語語法:CREATE[ORREPLACE]PROCEDUREProcedure_name[(argment[{IN|OUT|INOUT}]Type,argment[{IN|OUT|INOUT}]Type][AUTHIDDEFINER|CURRENT_USER]{IS|AS}<類型.變量的說明明>BEGIN<執(zhí)行部分>EXCEPTION<可選的異常常錯誤處理理程序>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ù)數(shù)據(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是違反唯一一約束條件件的錯誤代代碼*/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)用存儲過過程ORACLE使用EXECUTE語句來實(shí)現(xiàn)現(xiàn)對存儲過過程的調(diào)用用:EXEC[UTE]Procedure_name(parameter1,parameter2…);存儲過程和和調(diào)用實(shí)實(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)經(jīng)查到!');EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('你需要的數(shù)數(shù)據(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é)果::編碼為7788的員工已經(jīng)經(jīng)查到!姓名:SCOTT工資:3000編碼為7902的員工已經(jīng)經(jīng)查到!姓名:FORD工資:3000你需要的數(shù)數(shù)據(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號部部門門工工資資總總和和::'||v_sum||',人數(shù)數(shù)::'||v_num);Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號部部門門工工資資總總和和::'||v_sum||',人數(shù)數(shù)::'||v_num);END;運(yùn)行行結(jié)結(jié)果果::30號部部門門工工資資總總和和::9400,人數(shù)數(shù)::610號部部門門工工資資總總和和::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ù)不不存在在!');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);ENDproc_demo;BEGINProc_demo(30,v_sum,v_num);DBMS_OUTPUT.PUT_LINE('30號部門門工資資總和和:'||v_sum||',人數(shù)數(shù):'||v_num);Proc_demo(sal_sum=>v_sum,emp_count=>v_num);DBMS_OUTPUT.PUT_LINE('10號部門門工資資總和和:'||v_sum||',人數(shù)數(shù):'||v_num);END;運(yùn)行結(jié)結(jié)果::30號部門門工資資總和和:9400,人數(shù)::610號部門門工資資總和和:8750,人數(shù)::3刪除過過程和和函數(shù)數(shù)刪除過過程:語法如如下::DROPPROCEDURE[user.]Procudure_name;刪除函函數(shù):語法如如下::DROPFUNCTION[user.]Function_name;包的創(chuàng)創(chuàng)建和和應(yīng)用用一個包包由兩兩個分分開的的部分分組成成:包定義義(PACKAGE):包包定義義部分分聲明明包內(nèi)內(nèi)數(shù)據(jù)據(jù)類型型、變變量、、常量量、游游標(biāo)、、子程程序和和異常常錯誤誤處理理等元元素,,這些些元素素為包包的公公有元元素。。包主體體(PACKAGEBODY):包包主體體則是是包定定義部部分的的具體體實(shí)現(xiàn)現(xiàn),它它定義義了包包定義義部分分所聲聲明的的游標(biāo)標(biāo)和子子程序序,在在包主主體中中還可可以聲聲明包包的私私有元元素。。包定義義和包包主體體分開開編譯譯,并并作為為兩部部分分分開的的對象象存放放在數(shù)數(shù)據(jù)庫庫字典典中,,詳見見數(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語句END[package_name];包的開開發(fā)步步驟與開發(fā)發(fā)存儲儲過程程類似似,包包的開開發(fā)需需要幾幾個步步驟::將每個個存儲儲過程程調(diào)式式正確確;用文本本編輯輯軟件件將各各個存存儲過過程和和函數(shù)數(shù)集成成在一一起;;按照包包的定定義要要求將將集成成的文文本的的前面面加上上包定定義;;按照包包的定定義要要求將將集成成的文文本的的前面面加上上包主主體;;使用SQLPLUS或開發(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是違反反唯一一約束束條件件的錯錯誤代代碼*/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)建包包體實(shí)實(shí)例例續(xù)續(xù)…PROCEDUREquery_dept(dept_noINNUMBER)ISBEGINSELECT*INTODeptRecFROMdeptWHEREdeptno=dept_no;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('數(shù)據(jù)庫庫中沒沒有編編碼為為'||dept_no||'的部門門');WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE('程序運(yùn)運(yùn)行錯錯誤!請使用用游標(biāo)標(biāo)');WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);ENDquery_dept;BEGINNull;ENDdemo_pack;調(diào)用包包示例例DECLAREVarNUMBER;BEGINVar:=demo_pack.add_dept(90,’Admin’,‘‘Beijing’’);IFvar=-1THENDBMS_OUTPUT.PUT_LINE(SQLCODE||’’----‘||SQLERRM);ELSIFvar=0THENDBMS_OUTPUT.PUT_LINE(‘該部門門記錄錄已經(jīng)經(jīng)存在在!’’);ELSEDBMS_OUTPUT.PUT_LINE(‘添加記記錄成成功??!’);Demo_pack.query_dept(90);DBMS_OUTPUT.PUT_LINE(demo_pack.DeptRec.deptno||’---‘||demo_pack.DeptRec.dname||’---‘||demo_pack.DeptRec.loc);var:=demo_pack.remove_de

溫馨提示

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

最新文檔

評論

0/150

提交評論