当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火。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. 报错:3 字节的 UTF-8 序列的字节 3 无效。

    错误如下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  2. UVA11806 Cheerleaders (容斥)

    题目链接 Solution 可以考虑到总方案即为 \(C_{nm}^k\) . 考虑到要求的是边缘都必须至少有 \(1\) ,所以考虑不合法的. 第一行和最后一行没有的方案即为 \(C_{(n-1)m ...

  3. css的fix高度缺失

    这个方法是百度百科手机页面用的,先为固定定位元素设一个父元素,不设高度,不设宽度,什么都不设,他的第一个子元素是我们需要做固定定位的元素,这个按照需求写好样式,此时,父元素的高度依然是0,如何使得父元 ...

  4. input上传多张图片

    input的file上传多张图片的时候,用ajaxupload这个插件的时候,每次执行完,需要重新生成元素再绑定事件

  5. JavaScript (JS)基础:BOM 浅析 (含window对象相关基本方法、属性解析)

    ① window对象(Math方法也属于window对象): window对象是JavaScript中的顶级对象,所有定义在全局作用域中的变量.函数都会变成window对象的属性和方法,window对 ...

  6. Secure services with TLS ---Docker配置https

    官方文档:https://docs.docker.com/ee/ucp/interlock/usage/tls/

  7. hdu 1025 n*logn最长上升子序列

    /* TLE */ #include <iostream> #include <cstdio> #include <cstring> using namespace ...

  8. C# 读取计算机CPU,HDD信息

    public string getCpuInfo() //读取CPU信息 { ManagementClass mobj = new ManagementClass("Win32_Proces ...

  9. 1月24日考试(ftp密码)

    错因分析 ♦对文件的保存不够恰当,例如第一题和第三题的题目,我是真的很愤怒,第一题在我写了一个多小时,终于样例成功.可是当我再一次打开文件时,里面只有我最开始的代码,谁可以告诉我这是为什么(我绝对保存 ...

  10. Error-invalid project description(转)

    导入android工程时有时会出现下面错误: 按照提示,说是当前的工作空间内已经有同名的工程了,但实际是没有的. 多次碰到这种问题后,无意间找到解决办法.导入工程时,不要选择Android,而是选择G ...