DECLARE
v_name VARCHAR2(20) := 'DataNotFound';
BEGIN
IF v_name = 'DivideIsZero' THEN
RAISE ZERO_DIVIDE;
ELSIF v_name = 'DataNotFound' THEN
RAISE NO_DATA_FOUND;
END IF;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION IN ZERO_DIVIDE');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION IN OTHERS');
DBMS_OUTPUT.PUT_LINE(CHR(10) || 'SQLCODE: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE(CHR(10) || 'SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_ERROR_STACK:');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_ERROR_BACKTRACE:');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
DBMS_OUTPUT.PUT_LINE(CHR(10) || 'DBMS_UTILITY.FORMAT_CALL_STACK:');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
END;
| 函數 | 含義 | 示例輸出 |
|---|---|---|
| SQLCODE | Oracle 錯誤號 (正數為用戶自定義異常) | 100 (NO_DATA_FOUND) |
| SQLERRM | 錯誤號對應的完整文本 | ORA-01403: 未找到數據 |
| FORMAT_ERROR_STACK | 完整錯誤消息堆棧 (含嵌套異常) | ORA-01403: 未找到數據 |
| FORMAT_ERROR_BACKTRACE | **異常拋出點**的行號/對象 (10g+) | ORA-06512: 在 line 12 |
| FORMAT_CALL_STACK | **當前執行點**的調用棧 (對象/行/名稱) | ----- PL/SQL Call Stack ----- object handle line object 673AAB40 46 anonymous block |
ERR_LOG (err_time, err_user, err_module, sqlcode, sqlerrm, error_stack, backtrace, call_stack, bind_vars)。WHEN OTHERS 中記錄上述 5 字段並 RAISE 或返回錯誤碼,嚴禁吞沒異常。DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 快速定位拋出行,結合 FORMAT_CALL_STACK 還原調用鏈。UTL_CALL_STACK 獲取結構化調用棧 (數組),便於程序化解析。EXCEPTION IN OTHERS
SQLCODE: 100
SQLERRM: ORA-01403: 未找到數據
DBMS_UTILITY.FORMAT_ERROR_STACK:
ORA-01403: 未找到數據
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE:
ORA-06512: 在 line 12
DBMS_UTILITY.FORMAT_CALL_STACK:
----- PL/SQL Call Stack -----
object handle line object
673AAB40 46 anonymous block