Oracle--plsql异常处理
Oracle中出現錯誤的情形通常分為編譯時錯誤(compile-timeerror)和運行時錯誤(run-time error),異常是在PL/SQL執行過程中出現的警告或錯誤。
?異常是如何觸發的? –發生了一個 Oracle 錯誤時 –使用RAISE語句顯式觸發
?如何處理異常? –用處理機截獲 –在調用環境中傳播異常
兩種觸發異常方法:
發生了 Oracle 錯誤,就會自動觸發相關的異常。可以在塊中使用RAISE語句顯式的觸發異常。被觸發的異常可以是預定義的異常,也可以是自定義的異常。
截獲異常
如果在塊的執行部分異常被觸發,當前的塊就會轉去執行異常處理部分的相應異常處理機。如果PL/SQL成功處理了異常,就不會把異常傳播給外部塊或環境,從而,PL/SQL塊正常結束。
異常的傳播
如果在塊的執行部分異常被觸發, 然而沒有相應的異常處理機,塊就會異常終止,而將異常傳遞給調用環境。
錯誤引發異常,每當引發異常時,都將控制權傳遞給異常處理程序,異常處理程序處理異常.
捕獲異常:
EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .]
?在異常部分WHEN 子句沒有數量限制 ?WHEN OTHERS 是最后一個子句 ?異常處理部分從關鍵字EXCEPTION開始 ?當異常拋出后,控制無條件轉到異常處理部分 ?在離開塊之前只能執行一種異常處理
預定義異常:
預定義異常是由 Oracle 為常見錯誤預先定義的,不需要顯式聲明。
在相應的異常處理例程中引用錯誤的標準名來截獲一個Oracle 服務器預定義錯誤。
例子:
DECLARE v_sal emp.sal%type; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno=999; EXCEPTION WHEN NO_DATA_FOUND then dbms_output.put_line('沒有查到數據'); WHEN others then dbms_output.put_line('其它異常'); END;
要截獲Oracle服務器沒有預定義的錯誤,需先聲明這個錯誤或者使用OTHERS處理機。?
非預定義異常:
1.? 在聲明部分聲明異常名。
? ? 語法:
????exception????? EXCEPTION;
? ? 其中:? exception? 異常名
2.? 使用PRAGMAEXCEPTION_INIT語句將異常處理名字和Oracle的錯誤代碼關聯起來.
? ?語法:
PRAGMA?? EXCEPTION_INIT ( exception, error_number ) ;
? ? 其中:? exception? 先前聲明的異常名
? ?error_number? 標準Oracle 錯誤代碼
3.? 在相應的異常處理例程中引用已聲明的異常。關鍵字 PRAGMA (偽指令pseudoinstructions)表示語句是一個編譯指令,在執行PL/SQL塊時并不處理該語句。在PL/SQL塊中,一個編譯指令EXCEPTION_INIT告訴編譯器將一個異常處理的名字和一個Oracle錯誤代碼聯系起來。
DECLARE e_emp_cons EXCEPTION; PRAGMA EXCEPTION_INIT(e_emp_cons,-00001); BEGIN INSERT INTO emp SELECT * FROM emp; EXCEPTION WHEN e_emp_cons THEN dbms_output.put_line('違反唯一性約束'); END;捕獲異常的函數: ?SQLCODE
? 返回Oracle的錯誤代碼
?SQLERRM? 返回和錯誤值相關聯的信息
SQLCODE值? 說明
? 0? ??? 沒有異常? ?
? 100? ? ? NO_DATA_FOUND異常
? 負數? ? ? 其它Oracle錯誤號在PL/SQL塊的聲明部分聲明。
使用RAISE語句顯式地發布 。
異常的傳遞;
當子塊自己處理異常時,它可以正常終止,并且在子塊的END語句之后可以立即將控制交給外部塊。
然而,如果 PL/SQL出現了異常,但當前塊中沒有針對該異常的處理機,就會尋找外部塊中有沒有處理機,如果所有的外部塊都不能處理這個異常,則就會在宿主環境中出現未經處理的異常。
當把異常傳播給外部塊,則當前塊中的等待執行代碼都不再被執行。
這種方法的優點就是內部塊僅處理自己特有的錯誤,而將一般的異常處理留給外部塊。
Raise_Application_Error過程–用于創建用戶定義的錯誤消息的過程 –向用戶返回錯誤,并且其返回格式和其它Oracle錯誤的格式相同 –既可以在可執行部分中使用,也可以在異常部分中使用
? Raise_Application_Error(error_number,message);
–錯誤編號必須介于 –20000 和 –20999 之間 –錯誤消息的長度可長達 2048 個字節利用過程 RAISE_APPLICATION_ERRO返回一個非標準的錯誤代碼和錯誤消息,從而可以和預定義異常進行交互。使用RAISE_APPLICATION_ERROR就可以向應用程序報告錯誤消息,并且避免了返回沒有處理過的異常。
執行區域: BEGIN … delete from emp where demtno=10; if SQL%NOTFOUND then Raise_Application_Error(-20202, ’this is not a valid department’); end if; … 異常區域: EXCEPTION when NO_DATA_FOUND then Raise_Application_Error(-20202, ’this is not a valid department’); END;轉載于:https://www.cnblogs.com/android-html5/archive/2012/03/29/2534075.html
總結
以上是生活随笔為你收集整理的Oracle--plsql异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习6——条件,循环语句
- 下一篇: 使用nginx+tomcat实现动静分离