业务场景:sql
当一个DML运行的时候,若是遇到了错误,则这条语句会整个回滚,就好像没有执行过。不过对于一个大的DML而言,若是个别数据错误而致使整个语句的回滚,会浪费不少的资源和运行时间,从10g开始Oracle支持记录DML语句的错误,而容许语句自动继续执行。ide
DBMS_ERRLOG提供了一个存储过程CREATE_ERROR_LOG,这个存储过程建立一个错误日志表,当DML出错时,操做不会终止和回滚,而是将相关的错误写到错误日志表中。
CREATE_ERROR_LOG不支持一些数据类型:LONG, CLOB,BLOB, BFILE, and ADT。oop
简单实例:测试
1.建立test2表fetch
2.调用存储过程自动建立相应的错误日志表日志
begin
dbms_errlog.create_error_log('TEST2','LOG_TEST2');
end;ip
相应的错误日志表LOG_TEST2结构资源
3.测试it
执行两次一下sql语句pip
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
极可能是存储过程当中可能出现全角的空格,这种错是不可见的,存储过程只接受半角的空格,这种错误属于比较难查的。好比$符是识别不了的。