程序在執行過程中出現異常是正常的,在程序的編寫過程中出現異常也是不可避免的。但是要有相應的異常處理的機
制,來保證程序的正常執行。PL/SQL程序執行過程中出現的錯誤,稱為異常。一個優秀的程序都應該能夠正確處理
各種出錯的情況,並盡可能的從錯誤中恢復。PL/SQL提供了異常處理機制。
概念:
異常處理(exception)是用來處理正常執行過程中未預料的事件,程序塊的異常處理定義的錯誤和自定義的錯誤,
由於PL/SQL程序塊一旦產生異常而沒有指出如何處理時,程序就會異常的終止。
有三種類型的錯誤
預定義異常:
是Oracle系統異常中的一種,用於處理常見的異常。Oracle系統定義了它們的錯誤編號和名字。當運行PL/SQL代碼產生預定義錯誤時,該異常會被自動的拋出,異常處理機制捕獲後,進行處理。最常用的兩個異常是no_date_found 和 too_mang_rows ,錯誤編號為1403 和1422 ,為沒有找到數據和結果返回多行錯誤。
非預定義異常:
該類異常特定是,Oracle定義了它們的編號,但是沒有名字,需要用戶在聲明中定義它們的名字,有Oracle自動引發。
自定義異常:
處理用戶定義的錯誤,有些操作並不會產生系統錯誤,但是從業務角度規則考慮,不是很符合規則。
結構:
EXCEPTION
WHEN exception_name1 THEN code ;
WHEN exception_name2 THEN code ;
...
WHEN OTHERS THEN code ;
END ;
異常處理步驟
定義異常:在聲明部分為錯誤異常定義。exce_name exception ; pragma exception_init(exce_name error_number);
拋出異常:產生錯誤時,拋出與異常對應的錯誤。raise exce_name ;
捕獲及處理異常:異常處理部分對異常進行捕獲,並進行處理。
例:使用預定義異常no_data_found ,避免運行時提示未找到數據。
declare
v_sal emp.sal%type ;
begin
select sal into v_sal from emp where empno = 7938 ;
dbms_output.put_line(v_sal);
exception
when no_data_found then dbms_output.put_line('沒有該條數據');
end;
在執行delete from dept where deptno = 10語句的時候,系統會拋出 ORA-02292: 違反完整約束條件 (SCOTT.FK_DEPTNO) - 已找到子記錄 異常。系統為它定義了編號,但是沒有命名名字,用戶可以自定義一個名字。
例:非定義異常,處理違反完整性約束錯誤。
declare
exce_deptno exception ;
pragma exception_init(exce_deptno , -2292) ;
begin
delete from dept where deptno = 10 ;
exception
when exce_deptno then dbms_output.put_line('雇員表中使用了該部門號');
end ;
例:用戶自定義異常,當雇員的工資小於1000 時,拋出異常並進行處理。
declare
e_sal exception ;
v_empno emp.empno%type ;
cursor cou_sal is select * from emp ;
begin
for c in cou_sal loop
dbms_output.put_line(c.sal);
if(c.sal < 1000) then
v_empno := c.empno;
raise e_sal ;
end if ;
end loop ;
exception
when e_sal then dbms_output.put_line(v_empno || '該漲工資了');
end ;
異常函數
PL/SQL程序在出現出錯時,通過使用異常函數可以獲得錯誤代碼以及相關的錯誤說明,使用SQLCODE用於獲得錯誤代碼,SQLERRM用戶獲得錯誤描述。
例:獲得錯誤代碼和描述
begin
delete from dept where deptno =10 ;
exception
when others then dbms_output.put_line(sqlcode || '---'||sqlerrm);
end ;