程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle學習筆記17--異常處理(PL/SQL)

Oracle學習筆記17--異常處理(PL/SQL)

編輯:Oracle教程

程序在執行過程中出現異常是正常的,在程序的編寫過程中出現異常也是不可避免的。但是要有相應的異常處理的機

制,來保證程序的正常執行。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 ;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved