第12章 異常處理_第1頁
第12章 異常處理_第2頁
第12章 異常處理_第3頁
第12章 異常處理_第4頁
第12章 異常處理_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第12章異常處理212異常處理異常概述異常處理過程異常的傳播312.1異常概述Oracle錯(cuò)誤處理機(jī)制異常的類型4(1)Oracle錯(cuò)誤處理機(jī)制Oracle中對(duì)運(yùn)行時(shí)錯(cuò)誤的處理采用了異常處理機(jī)制。一個(gè)錯(cuò)誤對(duì)應(yīng)一個(gè)異常,當(dāng)錯(cuò)誤產(chǎn)生時(shí)拋出相應(yīng)的異常,并被異常處理器捕獲,程序控制權(quán)傳遞給異常處理器,由異常處理器來處理運(yùn)行時(shí)錯(cuò)誤。

5(2)異常的類型預(yù)定義的Oracle異常(Oracle錯(cuò)誤)非預(yù)定義的Oracle異常(Oracle錯(cuò)誤)用戶定義的異常(用戶定義錯(cuò)誤)6預(yù)定義的Oracle異常當(dāng)Oracle錯(cuò)誤產(chǎn)生時(shí),與錯(cuò)誤對(duì)應(yīng)的預(yù)定義異常被自動(dòng)拋出,通過捕獲該異常可以對(duì)錯(cuò)誤進(jìn)行處理。常用預(yù)定義異常包括:7異常情況名錯(cuò)誤代碼描述CURSOR_ALREADY_OPENORA-06511嘗試打開已經(jīng)打開的游標(biāo)

INVALID_CURSORORA-01001不合法的游標(biāo)操作(如要打開已經(jīng)關(guān)閉的游標(biāo))

NO_DATA_FOUNDORA-01403沒有發(fā)現(xiàn)數(shù)據(jù)

TOO_MANY_ROWSORA-01422一個(gè)SELECTINTO語句匹配多個(gè)數(shù)據(jù)行INVALID_NUMBERORA-01722轉(zhuǎn)換成數(shù)字失敗

(‘X’)

VALUE_ERRORORA-06502截?cái)?、算法或轉(zhuǎn)換錯(cuò)誤,通常出現(xiàn)在賦值錯(cuò)誤

ZERO_DIVIDEORA-01476除數(shù)為0

ROWTYPE_MISMATCHORA-06504主機(jī)游標(biāo)變量與PL/SQL游標(biāo)變量類型不匹配8異常情況名錯(cuò)誤代碼描述DUP_VAL_ON_INDEXORA-00001違反唯一性約束或主鍵約束SYS_INVALID_ROWIDORA-01410轉(zhuǎn)換成ROWID失敗TIMEOUT_ON_RESOURCEORA-00051在等待資源中出現(xiàn)超時(shí)LOGIN_DENIEDORA-01017無效用戶名/密碼CASE_NOT_FOUNDORA-06592沒有匹配的WHEN子句NOT_LOGGED_ONORA-01012沒有與數(shù)據(jù)庫建立連接STORAGE_ERRORORA-06500PL/SQL內(nèi)部錯(cuò)誤PROGRAM_ERRORORA-06501PL/SQL內(nèi)部錯(cuò)誤9異常情況名錯(cuò)誤代碼描述ACCESS_INTO_NULLORA-06530給空對(duì)象屬性賦值COLLECTION_IS_NULLORA-06531對(duì)某NULLPL/SQL表或可變數(shù)組試圖應(yīng)用集合方法,而不是EXISTS

SELF_IS_NULLORA-30625調(diào)用空對(duì)象實(shí)例的方法SUBSCRIPT_BEYOND_COUNTORA-06533對(duì)嵌套表或數(shù)組索引引用時(shí)超出集合中元素的數(shù)量SUBSCRIPT_OUTSIDE_LIMITORA-06532對(duì)嵌套表或可變數(shù)組索引的引用超出聲明的范圍10非預(yù)定義異常有一些Oracle錯(cuò)誤沒有預(yù)定義異常與其關(guān)聯(lián),需要在語句塊的聲明部分聲明一個(gè)異常名稱,然后通過編譯指示PRAGMAEXCEPTION_INIT將該異常名稱與一個(gè)Oracle錯(cuò)誤相關(guān)聯(lián)。此后,當(dāng)執(zhí)行過程出現(xiàn)該錯(cuò)誤時(shí)將自動(dòng)拋出該異常。11聲明一個(gè)異常名稱e_integrityEXCEPTION;將異常與一個(gè)Oracle錯(cuò)誤號(hào)相綁定PRAGMAEXCEPTION-INIT(e_integrity,-2291)示例DECLAREe_deptno_fkEXCEPTION;PRAGMAEXCEPTION_INIT(e_deptno_fk,-2292);BEGIN……EXCEPTION……END;12用戶自定義的異常用戶定義錯(cuò)誤是指,有些操作并不會(huì)產(chǎn)生Oracle錯(cuò)誤,但是從業(yè)務(wù)規(guī)則角度考慮,認(rèn)為是一種錯(cuò)誤。用戶自定義異常必須在聲明部分進(jìn)行聲明。當(dāng)異常發(fā)生時(shí),系統(tǒng)不能自動(dòng)觸發(fā),需要用戶使用RAISE語句。在異常處理部分捕捉并處理異常。1312.2異常處理過程異常的定義異常的拋出異常的捕獲與處理OTHERS異常處理器14異常處理分3個(gè)步驟進(jìn)行:在聲明部分為錯(cuò)誤定義異常,包括非預(yù)定義異常和用戶定義異常。在執(zhí)行過程中當(dāng)錯(cuò)誤產(chǎn)生時(shí)拋出與錯(cuò)誤對(duì)應(yīng)的異常。在異常處理部分通過異常處理器捕獲異常,并進(jìn)行異常處理。15(1)異常的定義Oracle中的3種異常,其中預(yù)定義異常由系統(tǒng)定義,而其他兩種異常則需要用戶定義。定義異常方法e_exceptionEXCEPTION;如果是非預(yù)定義的異常,需要將異常與一個(gè)Oracle錯(cuò)誤相關(guān)聯(lián),其語法為:PRAGMAEXCEPTION_INIT(e_exception,-#####);注意Oracle內(nèi)部錯(cuò)誤號(hào)用一個(gè)負(fù)的5位數(shù)表示,如-02292。其中

-20999~-20000為用戶定義錯(cuò)誤的保留號(hào)。16(2)異常的拋出由于系統(tǒng)可以自動(dòng)識(shí)別Oracle內(nèi)部錯(cuò)誤,因此當(dāng)錯(cuò)誤產(chǎn)生時(shí)系統(tǒng)會(huì)自動(dòng)拋出與之對(duì)應(yīng)的預(yù)定義異?;蚍穷A(yù)定義異常。但是,系統(tǒng)無法識(shí)別用戶定義錯(cuò)誤,因此當(dāng)用戶定義錯(cuò)誤產(chǎn)生時(shí),需要用戶手動(dòng)拋出與之對(duì)應(yīng)的異常。用戶定義異常的拋出語法為RAISEuser_define_exception;17(3)異常的捕獲與處理異常處理器的基本形式為EXCEPTIONWHENexception1[ORexcetpion2…]THENsequence_of_statements1;WHENexception3[ORexception4…]THENsequence_of_statements2;……WHENOTHERSTHENsequence_of_statementsn;END;注意:一個(gè)異常處理器可以捕獲多個(gè)異常,只需在WHEN子句中用

OR連接即可;一個(gè)異常只能被一個(gè)異常處理器捕獲,并進(jìn)行處理。18查詢名為SMITH的員工工資,如果該員工不存在,則輸出“Thereisnotsuchanemployee!”;如果存在多個(gè)同名的員工,則輸出其員工號(hào)和工資。DECLAREv_salemp.sal%type;BEGINSELECTsalINTOv_salFROMempWHEREename='SMITH';DBMS_OUTPUT.PUT_LINE(v_sal);EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemplyee!');WHENTOO_MANY_ROWSTHENFORv_empIN(SELECT*FROMempWHEREename='SMITH')LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno||''||v_emp.sal);ENDLOOP;END;19刪除dept表中部門號(hào)為10的部門信息,如果不能刪除則輸出“Therearesubrecordsinemptable!”。DECLAREe_deptno_fkEXCEPTION;PRAGMAEXCEPTION_INIT(e_deptno_fk,-2292);BEGINDELETEFROMdeptWHEREdeptno=10;EXCEPTIONWHENe_deptno_fkTHENDBMS_OUTPUT.PUT_LINE('Therearesubrecordsinemptable!');END;20修改7844員工的工資,保證修改后工資不超過6000。DECLAREe_highlimitEXCEPTION;v_salemp.sal%TYPE;BEGINUPDATEempSETsal=sal+100WHEREempno=7844RETURNINGsalINTOv_sal;IFv_sal>6000THENRAISEe_highlimit;ENDIF;EXCEPTIONWHENe_highlimitTHENDBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!');ROLLBACK;END;21(4)OTHERS異常處理器OTHERS異常處理器是一個(gè)特殊的異常處理器,可以捕獲所有的異常。通常,OTHERS異常處理器總是作為異常處理部分的最后一個(gè)異常處理器,負(fù)責(zé)處理那些沒有被其他異常處理器捕獲的異常。

22DECLAREv_salemp.sal%TYPE;e_highlimitEXCEPTION;BEGINSELECTsalINTOv_salFROMempWHEREename='JOAN';UPDATEempSETsal=sal+100WHEREempno=7900;IFv_sal>6000THENRAISEe_highlimit;ENDIF;EXCEPTIONWHENe_highlimitTHENDBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!');ROLLBACK;WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE('Thereissomewronginselecting!');END;23可以通過兩個(gè)函數(shù)來獲取錯(cuò)誤相關(guān)信息。SQLCODE:返回當(dāng)前錯(cuò)誤代碼。如果是用戶定義錯(cuò)誤返回值為1;如果是ORA-1403:NODATAFOUND錯(cuò)誤,返回值為100其他Oracle內(nèi)部錯(cuò)誤返回相應(yīng)的錯(cuò)誤號(hào)。

SQLERRM:返回當(dāng)前錯(cuò)誤的消息文本。如果是Oracle內(nèi)部錯(cuò)誤,返回系統(tǒng)內(nèi)部的錯(cuò)誤描述;如果是用戶定義錯(cuò)誤,則返回信息文本為“User-definedException”。24DECLAREv_salemp.sal%TYPE;e_highlimitEXCEPTION;v_codeNUMBER(6);v_textVARCHAR2(200);BEGINSELECTsalINTOv_salFROMempWHEREename='JOAN';UPDATEempSETsal=sal+100WHEREempno=7900;IFv_sal>6000THENRAISEe_highlimit;ENDIF;EXCEPTIONWHENe_highlimitTHENDBMS_OUTPUT.PUT_LINE('Thesalaryistoolarge!');ROLLBACK;WHENOTHERSTHENv_code:=SQLCODE;v_text:=SQLERRM;DBMS_OUTPUT.PUT_LINE(v_code||''||v_text);END;2512.3異常的傳播執(zhí)行部分的異常聲明部分和異常處理部分的異常26(1)執(zhí)行部分異常的傳播如果當(dāng)前語句塊有該異常的處理器,則執(zhí)行之,并且成功完成該語句塊。然后,控制權(quán)傳遞到外層語句塊。

如果當(dāng)前語句塊沒有該異常的處理器,則通過在外層語句塊中產(chǎn)生該異常來傳播該異常。然后,執(zhí)行對(duì)外層語句塊執(zhí)行步驟1。如果沒有外層語句塊,則該異常將傳播到調(diào)用環(huán)境。

27DECLAREv_salemp.sal%TYPE;BEGINBEGINSELECTsalINTOv_salFROMempWHEREename='JOAN';EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemployee!');END;DBMS_OUTPUT.PUT_LINE('Nowthisisoutputtedbyouterblock!');END;/Thereisnotsuchanemployee!Nowthisisoutputtedbyouterblock!

28DECLAREv_salemp.sal%TYPE;BEGINBEGINSELECTsalINTOv_salFROMempWHEREdeptno=10;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thereisnotsuchanemployee!');END;DBMS_OUTPUT.PUT_LINE('Nowthisisoutputtedbyouterblock!');EXCEPTIONWHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE('Therearemor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論