当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火。10g R2之后有个新功能。将插入过程中失败的记录插入到还有一张表中。

SQL> drop table test purge;

SQL> drop table test_bad purge;

SQL> create table test as select * from dba_objects where 1<>1;

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 1<>1;

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)<=2 or object_id is null;

  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)<=2 or object_id is null;

  COUNT(1)

----------

106

须要说明的是:

1.插入到错误日志是自治事务,不会影响主事务。

2.使用log error并不会使append失效,但写error不会使用直接路径插入。

3.违反唯一键或约束的更新运算会导致失败回滚。

DML过程中记录错误日志的更多相关文章

  1. Asp.Net MVC中记录错误日志保存到本地txt文件

    为了方便查询系统出错弄个错误日志出来对于维护运维来说是很有必要的. 1.在Asp.Net MVC项目中的App_Start添加一个用于处理异常类的文件ErrorLog让他继承HandleErrorAt ...

  2. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  3. 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题

    我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...

  4. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  5. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  6. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  7. Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)

    以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...

  8. mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决

    mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决   最近新装好的my ...

  9. CAS SSO:汇集配置过程中的错误解决方法

    本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...

随机推荐

  1. make gif pic

    http://www.cockos.com/licecap/ licecap 1.open licecap 2.record ,make a pic filename,like pic1 3.work ...

  2. nodeJS学习(4)--- webstorm/...开发 NodeJS 项目-节1

    前提: 已安装好 IDE ,eg:webstorm/IDEA 2016.3 & 2017.1 nodeJS(含 npm 及 相应的模板等) 要用 webstorm 开发 NodeJS项目(we ...

  3. 支线剧情(bzoj 3876)

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

  4. configurationmanager.getsection usage example.

    1.app.config(note that attribute case sensitive!) <?xml version="1.0" encoding="ut ...

  5. AVRStudio 6 添加调试功能

    下载这个文件并安装就可以了:http://avr-jungo-usb.software.informer.com/download/ 具体可以看这个贴子:http://electronics.stac ...

  6. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  7. 关于Struts2中param的作用

    1.页面传参与配置传参的区别: 如果页面Form表单的参数在Action类中有相应的setter方法,则会优先取页面Form表单传过来的值,如果页面没有该属性同名的参数,则会从配置文件中取同名的参数值 ...

  8. 实现多线程sokect

    上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Clien ...

  9. pip源配置

    1.使用配置文件配置文件[global]trusted-host=mirrors.aliyun.comindex-url=http://mirrors.aliyun.com/pypi/simple/ ...

  10. linux创建和查看用户命令

    1.创建一个叫做hadoop的用户,用户的目录是/home/hadoop useradd -d /home/hadoop hadoop 2.输入密码 passwd hadoop 3.删除用户 user ...