当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火。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. LoadRunner中请求HTTPS页面。

    哎,真是服了.国内网站上写的解决方法如此的粗糙. 如果用loadrunner访问HTTPS网页时出现:shut connection during attempt to negotiate SSL s ...

  2. python转exe2

    转载自 xiake200704       最终编辑 xiake200704 一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你 ...

  3. linux之创建临时文件的方法

    有时候,我们需要创建文件临时存放一些输出的信息,创建文件时就可能出现文件名存在的问题.如何创建唯一的文件名,Linux为我们提供几个方案: 1.mktemp(强烈推荐) The  mktemp  ut ...

  4. 【BZOJ3895】取石子(博弈,记忆化搜索)

    题意: Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:1:从某堆石子中取走一个2:合并任意两堆石 ...

  5. CF 148D Bag of mice【概率DP】

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...

  6. android基本控件学习-----Date&Time

    Date&Time这里一共讲解下面6个: TextClock(文本时钟),AnalogClock(模拟时钟),Chronometer(计时器),DatePicker(日期选择器),TimePi ...

  7. os模块 文件操作

    下面的方法可以在python程序里直接生成文件到系统路径(windows环境下测试): <<<<<<要注意字符串前面要加字母r>>>>> ...

  8. TDictionary字典 记录 的赋值。

    type TRen = record age: Integer; //把name定义成结构的属性. private Fname: string; procedure Setname(const Val ...

  9. Java发送邮件--web.xml配置,Java代码配置

    前言:我目前总结的使用java发送邮件的方式有两种,分别是在spring框架xml配置文件使用bean标签,另一种方法是把发送功能封装成一个对象,废话不多说上代码, 边看代码边讲解,希望对需要的人能有 ...

  10. hdu 4990(数学,等比数列求和)

    Reading comprehension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...