在寫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;
運行:


