DML Error Logging 允許 INSERT/UPDATE/DELETE/MERGE 遇到行級錯誤 (型別轉換失敗、約束違反、空值違反) 時,將錯誤行導向錯誤日誌表,正常行繼續執行,事務不回滾。類似 SQL*Loader 的 BAD FILE 機制,但純 SQL 實現。
-- 原表
DESC my_test;
-- SID NUMBER, NAME VARCHAR2(20), GENDER INTEGER, AGE NUMBER, HOBBY VARCHAR2(20)
-- 執行套件建立日誌表
EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('my_test', 'my_test_bad');
-- 日誌表結構
DESC my_test_bad;
-- ORA_ERR_NUMBER$, ORA_ERR_MESG$, ORA_ERR_ROWID$, ORA_ERR_OPTYP$, ORA_ERR_TAG$
-- 原表所有欄位 (轉為 VARCHAR2(4000))
ORA_ERR_TAG$ 可存放自定義標記 (如批次號)。
-- 插入含錯誤資料 (AGE 欄位放字串 'age')
INSERT INTO my_test (sid, name, gender, age, hobby)
VALUES (12, 'joy', 2, 'age', 'book,football,run')
LOG ERRORS INTO my_test_bad REJECT LIMIT UNLIMITED;
-- 查詢錯誤日誌
SELECT * FROM my_test_bad;
結果包含:錯誤代碼 (1722)、錯誤訊息、操作類型 (I)、原始行資料。
UPDATE my_test SET age = 'yyy' WHERE sid = 12 LOG ERRORS INTO my_test_bad;
DELETE FROM my_test WHERE sid = 12 LOG ERRORS INTO my_test_bad;
MERGE INTO ... LOG ERRORS INTO my_test_bad;
LOG ERRORS 不觸發自動提交。若事務回滾,錯誤日誌仍保留 (獨立事務)。UNLIMITED 或具體數值允許繼續。