Oracle实现对表dml错误记录日志
DBMS_ERRLOG提供了一个存储过程CREATE_ERROR_LOG,这个存储过程创建一个错误日志表,当DML出错时,操作不会终止和回滚,而是将相关的错误写到错误日志表中。
CREATE_ERROR_LOG不支持一些数据类型:LONG, CLOB,BLOB, BFILE, and ADT。
简单示例:
SQL> create unique index ind_test00_a on test00(a);
Index created.
SQL> EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('TEST00','TEST00_ERROR_LOG');
PL/SQL procedure successfully completed.
SQL> desc test00
Name Null? Type
-------------------------------------------------------------------------------- -------------------------------------------------
A NUMBER(10)
B NUMBER(10)
SQL> desc test00_error_log
Name Null? Type
-------------------------------------------------------------------------------- -------------------------------------------------
ORA_ERR_NUMBER$ NUMBER
ORA_ERR_MESG$ VARCHAR2(2000)
ORA_ERR_ROWID$ ROWID
ORA_ERR_OPTYP$ VARCHAR2(2)
ORA_ERR_TAG$ VARCHAR2(2000)
A VARCHAR2(4000)
B VARCHAR2(4000)
SQL> INSERT INTO TEST00 values(1,1) LOG ERRORS INTOTEST00_ERROR_LOG REJECT LIMIT 1;
1 row created.
SQL> INSERT INTO TEST00 values(2,2) LOG ERRORS INTOTEST00_ERROR_LOG REJECT LIMIT 1;
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test00;
A B
---------- ----------
1 1
2 2
SQL> select * from test00_error_log;
no rows selected
SQL> INSERT INTO TEST00 values(2,2) LOG ERRORS INTOTEST00_ERROR_LOG REJECT LIMIT 1;
---插入重复数据,未报错,操作正常进行。
0 rows created.
SQL>commit;
Commit complete.
SQL> select * from test00; ---数据未插入到表中,结果是正确的
A B
---------- ----------
1 1
2 2
SQL> select * from test00_error_log; ---错误操作记录到了错误日志表中
ORA_ERR_NUMBER$ORA_ERR_MESG$ ORA_ERR_ROWID$ ORA_ERR_OPTYP$ ORA_ERR_TAG$ A B
--------------- ------------------------------------------------------------------ -------------------------------------------- ---------- ----------
1 ORA-00001: unique constraint(WXL I 2 2
UN.IND_TEST00_A) violated
SQL>
附录:
CREATE_ERROR_LOG ProcedureParameters
CREATE_ERROR_LOG参数:
Parameter | Description |
---|---|
| The name of the DML table to basethe error logging table on. The name can be fully qualified (forexample, |
| The name of the error loggingtable you will create. The default is the first 25characters in the name of the DML table prefixed with
|
| The name of the owner of theerror logging table. You can specify the owner in |
| The tablespace the error loggingtable will be created in. If not specified, the default tablespacefor the user owning the DML error logging table will beused. |
| When set to When set to The default is |