ORACLE異常的詳細(xì)介紹.docx_第1頁
ORACLE異常的詳細(xì)介紹.docx_第2頁
ORACLE異常的詳細(xì)介紹.docx_第3頁
ORACLE異常的詳細(xì)介紹.docx_第4頁
ORACLE異常的詳細(xì)介紹.docx_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本篇主要內(nèi)容如下:5.1異常處理概念5.1.1預(yù)定義的異常處理5.1.2非預(yù)定義的異常處理5.1.3用戶自定義的異常處理5.1.4用戶定義的異常處理5.2異常錯(cuò)誤傳播5.2.1在執(zhí)行部分引發(fā)異常錯(cuò)誤5.2.2在聲明部分引發(fā)異常錯(cuò)誤5.3異常錯(cuò)誤處理編程5.4在PL/SQL中使用SQLCODE,SQLERRM異常處理函數(shù)即使是寫得最好的PL/SQL程序也會(huì)遇到錯(cuò)誤或未預(yù)料到的事件。一個(gè)優(yōu)秀的程序都應(yīng)該能夠正確處理各種出錯(cuò)情況,并盡可能從錯(cuò)誤中恢復(fù)。任何ORACLE錯(cuò)誤(報(bào)告為ORA-xxxxx形式的Oracle錯(cuò)誤號(hào))、PL/SQL運(yùn)行錯(cuò)誤或用戶定義條件(不一寫是錯(cuò)誤),都可以。當(dāng)然了,PL/SQL編譯錯(cuò)誤不能通過PL/SQL異常處理來處理,因?yàn)檫@些錯(cuò)誤發(fā)生在PL/SQL程序執(zhí)行之前。ORACLE提供異常情況(EXCEPTION)和異常處理(EXCEPTIONHANDLER)來實(shí)現(xiàn)錯(cuò)誤處理。5.1異常處理概念異常情況處理(EXCEPTION)是用來處理正常執(zhí)行過程中未預(yù)料的事件,程序塊的異常處理預(yù)定義的錯(cuò)誤和自定義錯(cuò)誤,由于PL/SQL程序塊一旦產(chǎn)生異常而沒有指出如何處理時(shí),程序就會(huì)自動(dòng)終止整個(gè)程序運(yùn)行.有三種類型的異常錯(cuò)誤: 1預(yù)定義(Predefined)錯(cuò)誤ORACLE預(yù)定義的異常情況大約有24個(gè)。對(duì)這種異常情況的處理,無需在程序中定義,由ORACLE自動(dòng)將其引發(fā)。 2非預(yù)定義(Predefined)錯(cuò)誤 即其他標(biāo)準(zhǔn)的ORACLE錯(cuò)誤。對(duì)這種異常情況的處理,需要用戶在程序中定義,然后由ORACLE自動(dòng)將其引發(fā)。 3用戶定義(User_define)錯(cuò)誤程序執(zhí)行過程中,出現(xiàn)編程人員認(rèn)為的非正常情況。對(duì)這種異常情況的處理,需要用戶在程序中定義,然后顯式地在程序中將其引發(fā)。異常處理部分一般放在PL/SQL程序體的后半部,結(jié)構(gòu)為:EXCEPTIONWHENfirst_exceptionTHENWHENsecond_exceptionTHENWHENOTHERSTHENEND;復(fù)制代碼異常處理可以按任意次序排列,但OTHERS必須放在最后.5.1.1預(yù)定義的異常處理 預(yù)定義說明的部分ORACLE異常錯(cuò)誤錯(cuò)誤號(hào)異常錯(cuò)誤信息名稱說明ORA-0001Dup_val_on_index違反了唯一性限制ORA-0051Timeout-on-resource在等待資源時(shí)發(fā)生超時(shí)ORA-0061Transaction-backed-out由于發(fā)生死鎖事務(wù)被撤消ORA-1001Invalid-CURSOR試圖使用一個(gè)無效的游標(biāo)ORA-1012Not-logged-on沒有連接到ORACLEORA-1017Login-denied無效的用戶名/口令ORA-1403No_data_foundSELECTINTO沒有找到數(shù)據(jù)ORA-1422Too_many_rowsSELECTINTO返回多行ORA-1476Zero-divide試圖被零除ORA-1722Invalid-NUMBER轉(zhuǎn)換一個(gè)數(shù)字失敗ORA-6500Storage-error內(nèi)存不夠引發(fā)的內(nèi)部錯(cuò)誤ORA-6501Program-error內(nèi)部錯(cuò)誤ORA-6502Value-error轉(zhuǎn)換或截?cái)噱e(cuò)誤ORA-6504Rowtype-mismatch宿主游標(biāo)變量與PL/SQL變量有不兼容行類型ORA-6511CURSOR-already-OPEN試圖打開一個(gè)已處于打開狀態(tài)的游標(biāo)ORA-6530Access-INTO-null試圖為null對(duì)象的屬性賦值ORA-6531Collection-is-null試圖將Exists以外的集合(collection)方法應(yīng)用于一個(gè)nullpl/sql表上或varray上ORA-6532Subscript-outside-limit對(duì)嵌套或varray索引得引用超出聲明范圍以外ORA-6533Subscript-beyond-count對(duì)嵌套或varray索引得引用大于集合中元素的個(gè)數(shù).對(duì)這種異常情況的處理,只需在PL/SQL塊的異常處理部分,直接引用相應(yīng)的異常情況名,并對(duì)其完成相應(yīng)的異常錯(cuò)誤處理即可。例1:更新指定員工工資,如工資小于1500,則加100;DECLAREv_empnoemployees.employee_id%TYPE:=&empno;v_salemployees.salary%TYPE;BEGINSELECTsalaryINTOv_salFROMemployeesWHEREemployee_id=v_empno;IFv_sal=1500THENUPDATEemployeesSETsalary=salary+100WHEREemployee_id=v_empno;DBMS_OUTPUT.PUT_LINE(編碼為|v_empno|員工工資已更新!);ELSEDBMS_OUTPUT.PUT_LINE(編碼為|v_empno|員工工資已經(jīng)超過規(guī)定值!);ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE(數(shù)據(jù)庫中沒有編碼為|v_empno|的員工);WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(程序運(yùn)行錯(cuò)誤!請(qǐng)使用游標(biāo));WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END;復(fù)制代碼5.1.2非預(yù)定義的異常處理對(duì)于這類異常情況的處理,首先必須對(duì)非定義的ORACLE錯(cuò)誤進(jìn)行定義。步驟如下:1.在PL/SQL塊的定義部分定義異常情況:EXCEPTION;2.將其定義好的異常情況,與標(biāo)準(zhǔn)的ORACLE錯(cuò)誤聯(lián)系起來,使用EXCEPTION_INIT語句:PRAGMAEXCEPTION_INIT(,);3.在PL/SQL塊的異常情況處理部分對(duì)異常情況做出相應(yīng)的處理。例2:刪除指定部門的記錄信息,以確保該部門沒有員工。INSERTINTOdepartmentsVALUES(50,FINANCE,CHICAGO);DECLAREv_deptnodepartments.department_id%TYPE:=&deptno;deptno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);/*-2292是違反一致性約束的錯(cuò)誤代碼*/BEGINDELETEFROMdepartmentsWHEREdepartment_id=v_deptno;EXCEPTIONWHENdeptno_remainingTHENDBMS_OUTPUT.PUT_LINE(違反數(shù)據(jù)完整性約束!);WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END;復(fù)制代碼5.1.3用戶自定義的異常處理當(dāng)與一個(gè)異常錯(cuò)誤相關(guān)的錯(cuò)誤出現(xiàn)時(shí),就會(huì)隱含觸發(fā)該異常錯(cuò)誤。用戶定義的異常錯(cuò)誤是通過顯式使用RAISE語句來觸發(fā)。當(dāng)引發(fā)一個(gè)異常錯(cuò)誤時(shí),控制就轉(zhuǎn)向到EXCEPTION塊異常錯(cuò)誤部分,執(zhí)行錯(cuò)誤處理代碼。對(duì)于這類異常情況的處理,步驟如下:1在PL/SQL塊的定義部分定義異常情況:EXCEPTION;2RAISE;3在PL/SQL塊的異常情況處理部分對(duì)異常情況做出相應(yīng)的處理。例3:更新指定員工工資,增加100;DECLAREv_empnoemployees.employee_id%TYPE:=&empno;no_resultEXCEPTION;BEGINUPDATEemployeesSETsalary=salary+100WHEREemployee_id=v_empno;IFSQL%NOTFOUNDTHENRAISEno_result;ENDIF;EXCEPTIONWHENno_resultTHENDBMS_OUTPUT.PUT_LINE(你的數(shù)據(jù)更新語句失敗了!);WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END;復(fù)制代碼5.1.4用戶定義的異常處理調(diào)用DBMS_STANDARD(ORACLE提供的包)包所定義的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯(cuò)誤消息,它為應(yīng)用程序提供了一種與ORACLE交互的方法。RAISE_APPLICATION_ERROR的語法如下:RAISE_APPLICATION_ERROR(error_number,error_message,keep_errors); 這里的error_number是從20,000到20,999之間的參數(shù),error_message是相應(yīng)的提示信息(2048字節(jié)),keep_errors為可選,如果keep_errors=TRUE,則新錯(cuò)誤將被添加到已經(jīng)引發(fā)的錯(cuò)誤列表中。如果keep_errors=FALSE(缺省),則新錯(cuò)誤將替換當(dāng)前的錯(cuò)誤列表。例4:創(chuàng)建一個(gè)函數(shù)get_salary,該函數(shù)檢索指定部門的工資總和,其中定義了-20991和-20992號(hào)錯(cuò)誤,分別處理參數(shù)為空和非法部門代碼兩種錯(cuò)誤:CREATETABLEerrlog(ErrcodeNUMBER,ErrtextCHAR(40);CREATEORREPLACEFUNCTIONget_salary(p_deptnoNUMBER)RETURNNUMBERASv_salNUMBER;BEGINIFp_deptnoISNULLTHENRAISE_APPLICATION_ERROR(-20991,部門代碼為空);ELSIFp_deptno0THENRAISE_APPLICATION_ERROR(-20992,無效的部門代碼);ELSESELECTSUM(employees.salary)INTOv_salFROMemployeesWHEREemployees.department_id=p_deptno;RETURNv_sal;ENDIF;END;DECLAREV_salaryNUMBER(7,2);V_sqlcodeNUMBER;V_sqlerrVARCHAR2(512);Null_deptnoEXCEPTION;Invalid_deptnoEXCEPTION;PRAGMAEXCEPTION_INIT(null_deptno,-20991);PRAGMAEXCEPTION_INIT(invalid_deptno,-20992);BEGINV_salary:=get_salary(10);DBMS_OUTPUT.PUT_LINE(10號(hào)部門工資:|TO_CHAR(V_salary);BEGINV_salary:=get_salary(-10);EXCEPTIONWHENinvalid_deptnoTHENV_sqlcode:=SQLCODE;V_sqlerr:=SQLERRM;INSERTINTOerrlog(errcode,errtext)VALUES(v_sqlcode,v_sqlerr);COMMIT;ENDinner1;V_salary:=get_salary(20);DBMS_OUTPUT.PUT_LINE(部門號(hào)為20的工資為:|TO_CHAR(V_salary);BEGINV_salary:=get_salary(NULL);ENDinner2;V_salary:=get_salary(30);DBMS_OUTPUT.PUT_LINE(部門號(hào)為30的工資為:|TO_CHAR(V_salary);EXCEPTIONWHENnull_deptnoTHENV_sqlcode:=SQLCODE;V_sqlerr:=SQLERRM;INSERTINTOerrlog(errcode,errtext)VALUES(v_sqlcode,v_sqlerr);COMMIT;WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);ENDouter;復(fù)制代碼例5:定義觸發(fā)器,使用RAISE_APPLICATION_ERROR阻止沒有員工姓名的新員式記錄插入:CREATEORREPLACETRIGGERtr_insert_empBEFOREINSERTONemployeesFOREACHROWBEGINIF:new.first_nameISNULLOR:new.last_nameisnullTHENRAISE_APPLICATION_ERROR(-20000,Employeemusthaveaname.);ENDIF;END;復(fù)制代碼5.2異常錯(cuò)誤傳播由于異常錯(cuò)誤可以在聲明部分和執(zhí)行部分以及異常錯(cuò)誤部分出現(xiàn),因而在不同部分引發(fā)的異常錯(cuò)誤也不一樣。5.2.1在執(zhí)行部分引發(fā)異常錯(cuò)誤當(dāng)一個(gè)異常錯(cuò)誤在執(zhí)行部分引發(fā)時(shí),有下列情況:l如果當(dāng)前塊對(duì)該異常錯(cuò)誤設(shè)置了處理,則執(zhí)行它并成功完成該塊的執(zhí)行,然后控制轉(zhuǎn)給包含塊。l如果沒有對(duì)當(dāng)前塊異常錯(cuò)誤設(shè)置定義處理器,則通過在包含塊中引發(fā)它來傳播異常錯(cuò)誤。然后對(duì)該包含塊執(zhí)行步驟1)。5.2.2在聲明部分引發(fā)異常錯(cuò)誤如果在聲明部分引起異常情況,即在聲明部分出現(xiàn)錯(cuò)誤,那么該錯(cuò)誤就能影響到其它的塊。比如在有如下的PL/SQL程序:DECLAREnamevarchar2(12):=EricHu;其它語句BEGIN其它語句EXCEPTIONWHENOTHERSTHEN其它語句END;復(fù)制代碼 例子中,由于Abcnumber(3)=abc;出錯(cuò),盡管在EXCEPTION中說明了WHENOTHERSTHEN語句,但WHENOTHERSTHEN也不會(huì)被執(zhí)行。但是如果在該錯(cuò)誤語句塊的外部有一個(gè)異常錯(cuò)誤,則該錯(cuò)誤能被抓住,如:BEGINDECLAREnamevarchar2(12):=EricHu;其它語句BEGIN其它語句EXCEPTIONWHENOTHERSTHEN其它語句END;EXCEPTIONWHENOTHERSTHEN其它語句END;復(fù)制代碼5.3異常錯(cuò)誤處理編程在一般的應(yīng)用處理中,建議程序人員要用異常處理,因?yàn)槿绻绦蛑胁宦暶魅魏萎惓L幚恚瑒t在程序運(yùn)行出錯(cuò)時(shí),程序就被終止,并且也不提示任何信息。下面是使用系統(tǒng)提供的異常來編程的例子。5.4在PL/SQL中使用SQLCODE,SQLERRM異常處理函數(shù)由于ORACLE的錯(cuò)信息最大長(zhǎng)度是512字節(jié),為了得到完整的錯(cuò)誤提示信息,我們可用SQLERRM和SUBSTR函數(shù)一起得到錯(cuò)誤提示信息,方便進(jìn)行錯(cuò)誤,特別是如果WHENOTHERS異常處理器時(shí)更為方便。SQLCODE返回遇到的Oracle錯(cuò)誤號(hào),SQLERRM返回遇到的Oracle錯(cuò)誤信息.如:SQLCODE=-100SQLERRM=no_data_foundSQLCODE=0SQLERRM=normal,successfualcompletion例6.將ORACLE錯(cuò)誤代碼及其信息存入錯(cuò)誤代碼表CREATETABLEerrors(errnumNUMBER(4),errmsgVARCHAR2(100);DECLAREerr_msgVARCHAR2(100);BEGIN/*得到所有ORACLE錯(cuò)誤信息*/FORerr_numIN-100.0LOOPerr_msg:=SQLERRM(err_num);INSERTINTOerrorsVALUES(err_num,err_msg);ENDLOOP;END;DROPTABLEerrors;復(fù)制代碼例7.查詢ORACLE錯(cuò)誤代碼;BEGININSERTINTOemployees(employee_id,first_name,last_name,hire_date,department_id)VALUES(2222,Eric,Hu,SYSDATE,20);DBMS_OUTPUT.PUT_LINE(插入數(shù)據(jù)記錄成功!);INSERT

溫馨提示

  • 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)論