PLSQL中的異常處理

PLSQL中的異常一般有兩種:

1、Oracle 內部錯誤拋出的異常:這又分爲預定義異常(有錯誤號+常量定義) 和 非預定義例外 (僅有錯誤號,無常量定義)

2、程序員顯式的拋出的異常

處理預定義的例外:有些常見例外,Oracle 都已經預定義好了,使用時無需預先聲明,比如:

–NO_DATA_FOUND (沒找到數據)

–TOO_MANY_ROWS (列數超過範圍)

–INVALID_CURSOR

–ZERO_DIVIDE (被除數不能爲0)

–DUP_VAL_ON_INDEX

-VALUE_ERROR (數據賦值錯誤)

拋出異常:

declare

v_data number;

v_myexp exception; --定義一個異常變量

begin

v_data :=&inputData; --輸入數據

if v_data>10 and v_data<100 then

raise v_myexp;

處理異常:

使用exception處理異常:

例如處理被除數爲0的異常:

declare

v_result number;

begin

v_result:=10/0;

dbms_output.put_line('異常之後的代碼將不再執行!');

exception

when zero_divide then

dbms_output.put_line('被除數不能爲0!');

when others then

dbms_output.put_line('其他未知異常');

ROLLBACK;

v_error_code := SQLCODE ;

v_error_message := SQLERRM ;

end;

發生這種情況時,我們還是希望瞭解當時發生的Oracle錯誤號和相關描述信息,Oracle 提供了兩個內置函數 SQLCODE 和 SQLERRM 分別用來返回Oracle 錯誤號和錯誤描述

注意:1.異常之後的代碼將不再執行

2.異常可以嵌套

3.異常未處理會往外一層拋出

OTHERS的處理: Others表明我們程序員未能預計到這種錯誤,所以全部歸入到others 裏面去了

 

自定義異常:

方式一:在聲明塊中聲明exception對象,此方式有兩種選擇:

1.聲明異常對象並用名稱來引用它,此方式使用普通的others異常捕獲用戶定義異常;

2.聲明異常對象並將它與有效的Oracle錯誤代碼映射,需要編寫單獨的when語句塊捕獲;

例如:

declare

v_data number;

v_myexp exception; --定義一個異常變量

begin

v_data :=&inputData; --輸入數據

if v_data>10 and v_data<100 then

raise v_myexp;

end if;

exception

when v_myexp then

dbms_output.put_line('輸入數據有錯誤1');

dbms_output.put_line('sqlcode='||sqlcode);

dbms_output.put_line('sqlerrm='||sqlerrm);

end;

方式二:在執行快中構建動態異常。通過“raise_application_error”函數構建動態異常。在觸發動態異常時,可使用-2000到-2999範圍的數字。如果使用動態異常,可以在運行時指派錯誤消息。

declare

v_data number;

v_myexp exception; --定義一個異常變量

begin

v_data :=&inputData; --輸入數據

if v_data>10 and v_data<100 then

raise_application_error(-20789,'輸入數字不能在10-100之間!');

end if;

exception

when v_myexp then

dbms_output.put_line('輸入數據有錯誤1');

dbms_output.put_line('sqlcode='||sqlcode);

dbms_output.put_line('sqlerrm='||sqlerrm);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章