--第一種方式:使用raise_application_error拋出自定義異常 declare i number:=-1; begin if i=-1 then raise_application_error(-20000,'參數值不能為負'); --拋出自定義異常 end if; exception when others then dbms_output.put_line('err_code:'||sqlcode||';err_msg:'||sqlerrm); --進行異常處理 raise; --繼續拋出該異常 end; --第二種方式,使用 exception 進行異常的定義 declare i number:=-1; my_err exception; --自定義異常 PRAGMA EXCEPTION_INIT(my_err, -01476); --初始化異常(我理解就是將該異常綁定到某個錯誤代碼上) begin if i=-1 then raise my_err; --拋出自定義異常 end if; exception when my_err then --捕捉自定義異常 dbms_output.put_line('err_code:'||sqlcode||';err_msg:'||sqlerrm); --異常處理 raise; --繼續拋出這個自定義異常 when others then --捕捉其它異常 dbms_output.put_line('err_code:'||sqlcode||';err_msg:'||sqlerrm); --異常處理 raise; --繼續拋出異常 end; EXCEPTION WHEN l_exit THEN var_o_message := var_o_message; OPEN user_cusor FOR 'SELECT ''' || var_o_message || ''' AS VAR_O_MESSAGE FROM DUAL WHERE ROWNUM=1'; WHEN OTHERS THEN var_o_message := var_o_message || SQLERRM(SQLCODE) || dbms_utility.format_error_backtrace(); OPEN user_cusor FOR 'SELECT ''' || var_o_message || ''' AS VAR_O_MESSAGE FROM DUAL WHERE ROWNUM=1'; END; 第一種方式自定義異常的代碼范圍為:-20000到-20300 第二種方式的好處是,可以將自定義異常綁定到某上具體的預定義錯誤代碼上, 如ORA-01476: divisor is equal to zero 這樣我們就可以捕捉自定義異常而不需要用 others 進行捕捉了.但也不是所有的預定義異常都可以綁定,這個需要使用的時候自己多試試
Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。
OTHERS處理器應該是異常處理塊中的最后的異常處理器,因為它是用來捕獲除了別的異常處理器處理以外的所有的Oracle異常,所以在程序的最外層使用一個OTHERS處理器的話,將可以確保所有的錯誤都會被檢測到。
在一個內在的異常中,SQLCODE返回Oracle錯誤的序號,而SQLERRM返回的是相應的錯誤消息,錯誤消息首先顯示的是錯誤代碼。SQLCODE返回的是負數,除非Oracle的錯誤為“ORA-01403:NO DATA FOUND”(譯:ORA-01403:未找到數據),當Oracle錯誤為“ORA-01403:NO DATA FOUND”時,其對應的SQLCODE為+100。對於用戶自定義的異常,SQLCODE返回的是+1,而SQLERRM返回的是User-Defined Exception。
一個Oracle的錯誤消息最多只能包含512個字節的錯誤代碼。
如果沒有異常被觸發,則SQLCODE返回0,SQLERRM返回“ORA-0000:normal, successful completion”。
實例 Exception
when osi_general_error then
when OTHERS THEN
out_ErrorMsg := SUBSTR(SQLERRM,1,100);
out_ErrorNbr := ABS(SQLCODE);
僅僅輸出SQLCODE、SQLERRM是不夠的!!!dbms_utility.format_error_backtrace()控制台輸出如下:
-1:ORA-00001: unique constraint (SCOTT.SYS_C0012353) violated
ORA-06512: at "SCOTT.PROC_INSERT", line 2
ORA-06512: at line 2
ORA-00001: unique constraint (SCOTT.SYS_C0012353) violated
從中可以看出, dbms_utility.format_error_backtrace記錄了異常的具體的棧的信息,顯示了異常的具體的傳遞過程,對於我們調試PL/SQL代碼來說是很有好處的
可以直接定位到具體異常的位置