您好,欢迎访问一九零五行业门户网

DML过程中记录错误日志

当你插入几百万数据时,因为有几条脏数据而导致插入失败,是不是非常恼火。oracle 10g r2之后有个新功能,将插入过程中失败的记录
当你插入几百万数据时,因为有几条脏数据而导致插入失败,是不是非常恼火。oracle 10g r2之后有个新功能,,将插入过程中失败的记录插入到另一张表中。
sql> drop table test purge;
sql> drop table test_bad purge;
sql> create table test as select * from dba_objects where 11;
sql> execute dbms_errlog.create_error_log('test','test_bad');
create table test
(
  owner          varchar2(30),
  object_name    varchar2(128),
  subobject_name varchar2(30),
  object_id      number,
  data_object_id number,
  object_type    varchar2(19),
  created        date,
  last_ddl_time  date,
  timestamp      varchar2(19),
  status        varchar2(7),
  temporary      varchar2(1),
  generated      varchar2(1),
  secondary      varchar2(1),
  namespace      number,
  edition_name  varchar2(30)
);
create table test_bad
(
  ora_err_number$ number,
  ora_err_mesg$  varchar2(2000),
  ora_err_rowid$  urowid(4000),
  ora_err_optyp$  varchar2(2),
  ora_err_tag$    varchar2(2000),
  owner          varchar2(4000),
  object_name    varchar2(4000),
  subobject_name  varchar2(4000),
  object_id      varchar2(4000),
  data_object_id  varchar2(4000),
  object_type    varchar2(4000),
  created        varchar2(4000),
  last_ddl_time  varchar2(4000),
  timestamp      varchar2(4000),
  status          varchar2(4000),
  temporary      varchar2(4000),
  generated      varchar2(4000),
  secondary      varchar2(4000),
  namespace      varchar2(4000),
  edition_name    varchar2(4000)
);
sql> insert into test(owner) values(lpad('1',31,'aa'))
    log errors into test_bad;
insert into test(owner) values(lpad('1',31,'aa'))
                              *
第 1 行出现错误:
ora-12899: 列 lcam_test.test.owner 的值太大 (实际值: 31, 最大值: 30)
sql> insert into test(owner) values(lpad('2',30,'bb'))
    log errors into test_bad;
已创建 1 行。
sql> col ora_err_number format a8;
sql> col ora_err_mesg$ format a50;
sql> col owner format a20;
sql> select to_char(ora_err_number$) as ora_err_number, ora_err_mesg$, owner from test_bad;
ora_err_ ora_err_mesg$                                      owner
-------- -------------------------------------------------- --------------------
12899    ora-12899: 列 lcam_test.test.owner 的值太大  aaaaaaaaaaaaaaaaaaaa
        (实际值: 31, 最大值: 30)                          aaaaaaaaaa1
sql> select count(1) from test;
count(1)
----------
        1
sql> drop table test1 purge;
sql> drop table test_bad1 purge;
sql> create table test1 as select * from dba_objects where 11;
sql> alter table test1 modify object_id number(2);
sql> execute dbms_errlog.create_error_log('test1','test_bad1');
sql> insert into test1 select * from dba_objects
    log errors into test_bad1;
insert into test1 select * from dba_objects
                        *
第 1 行出现错误:
ora-01438: 值大于为此列指定的允许精度
sql> select count(1) from test1;
  count(1)
----------
        0
sql> select count(1) from dba_objects where length(object_id)  count(1)
----------
      106
--可以看到,上面的语句一有错误就回滚,需要写出下列语句
sql> insert into test1 select * from dba_objects
    log errors into test_bad1
    reject limit unlimited;
已创建106行。
sql> select count(1) from test1;
  count(1)
----------
      106
sql> select count(1) from dba_objects where length(object_id)  count(1)
----------
      106
需要说明的是:
1.插入到错误日志是自治事务,不会影响主事务。
2.使用log error并不会使append失效,但写error不会使用直接路径插入。
3.违反唯一键或约束的更新运算会导致失败回滚。
oracle dml流程
pl/sql“ ora-14551: 无法在查询中执行 dml 操作”解决
mysql常用ddl、dml、dcl语言整理(附样例)
oracle基本事务和forall执行批量dml练习
oracle dml语句(insert,update,delete) 回滚开销估算
本文永久更新链接地址:
其它类似信息

推荐信息