业务场景:
当一个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
很可能是存储过程中可能出现全角的空格,这种错是不可见的,存储过程只接受半角的空格,这种错误属于比较难查的。比如$符是识别不了的。