天天看點

PLSQL例外處理

之前已經将遊标浏覽了一遍,為了提高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