首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQLCODE 與 SQLERRM:異常處理中的錯誤捕獲利器

     編輯:Oracle 資料庫基礎

函數定位

SQLCODE 與 SQLERRM 是 PL/SQL 異常處理塊中**僅可在 `WHEN OTHERS` 或未命名異常處理器中調用**的內置函數,分別返回 Oracle 錯誤碼(數字)與錯誤消息文本(最多 512 字節)。

使用規範

BEGIN
  -- 業務邏輯
  NULL;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    -- 處理已知異常
    log_error('唯一約束違反', SQLCODE, SQLERRM);
  WHEN OTHERS THEN
    -- 捕獲所有其他異常,必須放在最後
    log_error('未預期錯誤', SQLCODE, SQLERRM);
    -- 可選:重新拋出或包裝為自定義異常
    RAISE_APPLICATION_ERROR(-20001, '系統錯誤: ' || SQLERRM);
END;

關鍵特性對照

特性SQLCODESQLERRM
返回類型NUMBERVARCHAR2
成功時值0'ORA-0000: normal, successful completion'
異常時值負數(如 -1, -1403)完整錯誤文本(含 ORA- 前綴)
可接受參數無可傳入錯誤碼:SQLERRM(-1403) 返回 'ORA-01403: no data found'
調用上下文僅異常處理器中僅異常處理器中(或傳入錯誤碼時可在任意處)

進階用法

1. 記錄完整錯誤堆棧(10g+)

WHEN OTHERS THEN
  INSERT INTO error_log (err_time, err_code, err_msg, err_stack, call_stack)
  VALUES (SYSTIMESTAMP, SQLCODE, SQLERRM, DBMS_UTILITY.FORMAT_ERROR_STACK, DBMS_UTILITY.FORMAT_CALL_STACK);

2. 區分「未找到數據」與其他錯誤

BEGIN
  SELECT ... INTO v_var FROM ... WHERE ...;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    -- SQLCODE = +100(正數),SQLERRM = 'ORA-01403: no data found'
    v_var := DEFAULT_VAL;
  WHEN OTHERS THEN
    -- 處理真正的錯誤
    RAISE;
END;

注意:`NO_DATA_FOUND` 的 SQLCODE 為 **+100**(正數),而非負數,`WHEN OTHERS` 不會捕獲它。

3. 自定義異常關聯錯誤碼

e_salary_too_high EXCEPTION;
PRAGMA EXCEPTION_INIT(e_salary_too_high, -20101);

BEGIN
  IF v_sal > 100000 THEN RAISE e_salary_too_high; END IF;
EXCEPTION
  WHEN e_salary_too_high THEN
    -- SQLCODE = -20101, SQLERRM = 'ORA-20101: User-Defined Exception'
    log_biz_error('薪資超標', SQLCODE, SQLERRM);
END;

最佳實踐清單

  1. 盡量使用具名異常處理器(`WHEN NO_DATA_FOUND`、`WHEN DUP_VAL_ON_INDEX`),保留 `WHEN OTHERS` 作為最後防線。
  2. `WHEN OTHERS` 中**必須記錄** `SQLCODE`、`SQLERRM` 及調用堆棧,否則生產故障無法溯源。
  3. 避免在 `WHEN OTHERS` 中直接 `RETURN` 或 `NULL` 吞沒異常,至少重新拋出或轉為業務異常。
  4. 利用 `SQLERRM(error_code)` 實現錯誤碼與消息的雙向查閱,便於文檔化錯誤碼表。

熟練掌握 `SQLCODE`/`SQLERRM` 的行為邊界,是編寫健壯 PL/SQL 異常處理體系的核心技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved