当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火。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. 调试Java代码(Eclipse)汇总

    Java 10个调试技巧(基础❤❤❤❤❤) Eclipse断点调试(和上一篇基本类似,补充❤❤) 使用Eclipse开发和调试java程序(从安装eclipse开始,特别细,有设置条件断点,回退的具体 ...

  2. client、offset、scroll

    1. client 客户区大小 1.1. clientHeight和clientWidth element.clientHeight表示元素可视区域的高度,包括可视区域中元素的 CSS height+ ...

  3. hdu 1503 最长公共子序列

    /* 给两个串a,b.输出一个最短的串(含等于a的子序列且含等于b的子序列) */ #include <iostream> #include <cstdio> #include ...

  4. 1180: [CROATIAN2009]OTOCI

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 638[Submit][ ...

  5. [LeetCode] Longest Common Prefix 字符串公有前序

    Write a function to find the longest common prefix string amongst an array of strings. Hide Tags Str ...

  6. FTK应用程序编程接口(API)手册-1【转】

    转自:http://blog.csdn.net/absurd/article/details/6702047 框架函数 框架函数支撑FTK的主体,它负责初始化应用程序,启动主循环和退出主循环.它对任何 ...

  7. Windows开发

    1. 介绍 这里简单介绍了Windows应用程序开发的基础知识 2. 基础 Windows下的应用程序有控制台程序和Win32窗口程序,这里讲的是Win32窗口程序 Windows提供了相关静态库(L ...

  8. linux 共享内存 信号量 同步

    这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...

  9. usb 2.0 支援的速度

    from http://www.usb.org/developers/docs/usb20_docs/ high speed : 480 Mb/s full speed : 12 Mb/s low s ...

  10. uva 177:Paper Folding(模拟 Grade D)

    题目链接 题意:一张纸,每次从右往左对折.折好以后打开,让每个折痕都自然的呈90度.输出形状. 思路:模拟折……每次折想象成把一张纸分成了正面在下的一张和反面在上的一张.维护左边和方向,然后输出.细节 ...