在寫oracle存儲過程的時候很多東西放到存儲過程里面比如一些判斷等,要比在程序邏輯里面簡單很多,但是也會涉及到捕獲和拋出一樣的問題。
捕獲異常
語法:
EXCEPTION WHEN excepttion_name1 then ........ WHEN excepttion_name2 then ........ WHEN excepttion_name3 then ........ End;
例子:
declare a int:=0; b int:=1; ex_1 exception; ex_2 exception; begin if a=0 then raise ex_1; end if; if b=1 then raise ex_2; end if; exception when ex_1 then DBMS_OUTPUT.put_line('捕獲了錯誤1'); when ex_2 then DBMS_OUTPUT.put_line('捕獲了錯誤2'); end;
輸出:
捕獲了錯誤1
這里由於在ex_1的地方就出現了錯誤 ,所以下面ex_2沒有執行,而是直接跳到錯誤處理的代碼部分了。在Oracle中不允許一個異常由多個異常處理塊來處理。
利用OhtERS處理所有的錯誤
declare a int:=0; ex_1 exception; begin if a=0 then raise ex_1; end if; exception when others then DBMS_OUTPUT.put_line('捕獲了全局錯誤'); end;
拋出異常
RAISE_APPLICATION_ERROR 函數
該函數是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其他機器上的SQLPLUS或者前台開發語言)
PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2); error_number_in :自定義的錯誤碼,容許從 -20000 到 -20999 之間,這樣就不會與 ORACLE 的任何錯誤代碼發生沖突。 error_msg_in:長度不能超過 2k,否則截取 2k
例子:讓一個數不能為0
declare a int:=0; begin if a=0 then RAISE_APPLICATION_ERROR(-20001,‘數值不能為0’); end if; end;
運行: