代码改变世界

dbms_errlog让DML操作记录日志

2012-05-07 14:50  红色闪电  阅读(1289)  评论(0编辑  收藏  举报

Oracle的SQL loader工具,可以记录错误日志,并限制错误记录数。Oracle在进行DML操作时使用dbms_errlog可达到同样的效果。

看一下测试纪录

 

1、首先创建一张数据源表
SQL>  create table t4 as select object_id from dba_objects;

Table created.

SQL> desc t4
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OBJECT_ID                                          NUMBER

2、检查数据源数据
SQL> select max(object_id) from t4;

MAX(OBJECT_ID)
--------------
         53071

SQL> select min(object_id) from t4;

MIN(OBJECT_ID)
--------------
             2
SQL> select count(*) from t4;

  COUNT(*)
----------
     50615            
3、创建目标表,并修改结构
SQL> create table t5 as select * from t4 where 1=2;

Table created.

SQL> alter table t5 modify (object_id number(3));

Table altered.

4、对目标表进行常规插入测试
SQL> insert into t5 select * from t4;
insert into t5 select * from t4
                      *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

5、使用dbms_errlog结合reject limit进行测试
SQL> exec dbms_errlog.create_error_log('t5','t5_errors');

PL/SQL procedure successfully completed.

SQL> insert into t5 select * from t4 log errors into t5_errors reject limit unlimited;

953 rows created.

SQL> select count(*) from t5;

  COUNT(*)
----------
       953

SQL> select count(*) from t5_errors;

  COUNT(*)
----------
     49662
    
SQL> rollback;

Rollback complete.

SQL> select count(*) from t5;

  COUNT(*)
----------
         0

SQL> select count(*) from t5_errors;

  COUNT(*)
----------
     49662
回滚操作不会影响错误日志的生成。

SQL> desc t5_errors
 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)
 OBJECT_ID                                          VARCHAR2(4000)

dbms_errlog会在参照表t5的基础上新建立一个表,并增加5个字段,记录DML错误日志。