之前已經将遊标浏覽了一遍,為了提高PLSQL程式健壯性,先來寫PLSQL的例外處理,即如果PLSQL代碼塊發生的報錯,正常下不去捕捉處理,肯定會停止執行,捕捉到了例外并進行相應的處理,可以讓程式繼續執行,發生的未知錯誤稱之為例外。
目标
1)使用預定義例外
2)使用非預定義例外
3)使用自定義例外
定義三種例外比較搞笑,預定義就是oracle常見的錯誤,非預定義就是處理預定義所不能處理的oracle錯誤,自定義就是處理跟oracle無關的錯誤。
捕捉并處理例外
EXCEPTION
WHEN exception1 Then
statement1
、、、、
WHEN OTHERS THEN
statementend
記住 when others 永遠在例外處理的最後一個條件那裡,代表了以上你寫的所有when都不滿足的時候滿足此others
【預定義錯誤】
由PLSQL提供的系統例外,違反了Oracle規則或系統限制時,就會觸發一個内部例外,大概提供了二十多個,每一個預定義例外對應一個Oracle系統錯誤,如NO_DATA_FOUND對應的是ORA-01403錯誤
當沒有資料擷取的時候就會隐含的觸發這個錯誤,TOO_MANY_ROWS等
【非預定義錯誤】
非預定義錯誤用于處理與預定義例外無關的Oracle錯誤,這裡給了一個案例就是比如違反了限制。
使用的時候需要三步:
1)定義部分定義例外名稱,declare e_integrity exception;
2)在例外和Oracle錯誤之間建立關聯 pragma exception_init(e_integrity,-2291);
3)例外處理部分捕捉并處理例外
declare
e_integrity exception;
pragma exception_init(e_integrity,-2291);
begin
update emp set deptno=%dno where empno=&eno;
commit;
exception
when e_integrity then
dbms_output.put_line('not exists deptno');
when others then
dbms_output.put_line(sqlcode);
end;
【自定義例外】
自定義例外最大的差別就是需要顯示的觸發,
使用的時候三步:
1)定義部分定義 e_no_employee exception;
2)執行部分觸發 if SQL%NOTFOUD then raise e_no_employee;
3)例外處理部分捕捉并處理
e_no_employee exception;
update emp set deptno=&dno where empno=&eno;
if SQL%NOTFOUND then
raise e_no_employee;
end if;
when e_integrity then
dbms_output.put_line('deptno not exists');
when e_no_employee then
dbms_output.put_line('empno not exists');
另外一種就是例外函數,這個在c編寫的時候經常用到就是SQLCODE和SQLERRM,用于取得錯誤号和錯誤資訊,
dbms_output.put_line(sqlerrm);
在一個另外就是編譯的時候經常用到的警告分為三類:
1)server:如參數的别名問題,
2)performance :性能問題,如類型變換時的性能問題
3)all:該關鍵字用于檢查所有警告
控制警告消息
alter system set plsql warnings='enable:all';
alter session set plsql_warnings='enable:performance';
alter procedure hello complie ;這句話好像是重新編譯hello過程
這個問題關鍵是了解這三類警告資訊,比如死代碼需要用哪個類檢查,不執行但是有應該是代碼塊執行的性能問題,是以檢查的時候制成performance,
另外一點是屬性與異常,比如SQL%NOTFOUND與NO_DATA_FOUND的差別于誰産生的,可以用在什麼時候前外别混淆了
本文轉自 aklaus 51CTO部落格,原文連結:http://blog.51cto.com/aklaus/1953983