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);