dbms_errlog.create_error_log 记录DML错误日志

业务场景:

当一个DML运行的时候,如果遇到了错误,则这条语句会整个回滚,就好像没有执行过。不过对于一个大的DML而言,如果个别数据错误而导致整个语句的回滚,会浪费很多的资源和运行时间,从10g开始Oracle支持记录DML语句的错误,而允许语句自动继续执行。

DBMS_ERRLOG提供了一个存储过程CREATE_ERROR_LOG,这个存储过程创建一个错误日志表,当DML出错时,操作不会终止和回滚,而是将相关的错误写到错误日志表中。
CREATE_ERROR_LOG不支持一些数据类型:LONG, CLOB,BLOB, BFILE, and ADT。

简单实例:

1.创建test2表

2.调用存储过程自动创建相应的错误日志表

begin 
  dbms_errlog.create_error_log('TEST2','LOG_TEST2');
end;

相应的错误日志表LOG_TEST2结构

3.测试

执行两次一下sql语句

insert into test2  values('1','zhangsan') LOG ERRORS INTO LOG_TEST2 REJECT LIMIT UNLIMITED;

然后查看test2表和Log_test2表

4.注意事项:

报错信息:

  begin case declare exit for
          goto if loop mod null pragma raise return select update while
          with <an identifier> <a double-quoted delimited-identifier>
          <a bind variable> << close current delete fetch lock insert
          open rollback savepoint set sql execute commit forall merge
          pipe

很可能是存储过程中可能出现全角的空格,这种错是不可见的,存储过程只接受半角的空格,这种错误属于比较难查的。比如$符是识别不了的。

猜你喜欢

转载自my.oschina.net/u/3409039/blog/1649615
今日推荐