DML过程中记录错误日志
当你插入几百万数据时,由于有几条脏数据而导致插入失败,是不是很恼火。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过程中记录错误日志的更多相关文章
- Asp.Net MVC中记录错误日志保存到本地txt文件
为了方便查询系统出错弄个错误日志出来对于维护运维来说是很有必要的. 1.在Asp.Net MVC项目中的App_Start添加一个用于处理异常类的文件ErrorLog让他继承HandleErrorAt ...
- ASP.NET MVC中Log4Net记录错误日志的使用
第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...
- 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题
我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...
- WebForm应用log4net记录错误日志——使用线程列队写入
我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...
- ASP.NET记录错误日志的方式
程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...
- 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误
SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- 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 ...
- CAS SSO:汇集配置过程中的错误解决方法
本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...
随机推荐
- HDU 4786 最小生成树变形 kruscal(13成都区域赛F)
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- vue-router 页面切换后保持在页面顶部而不是保持原先的滚动位置的办法
vue-router有提供一个方法scrollBehavior,它可以使切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. 这个功能只在 HTML5 history 模 ...
- hdu 4501 多维0-1背包
小明系列故事——买年货 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- codechef AUG17 T3 Greedy Candidates
Greedy Candidates Problem Code: GCAC The placements/recruitment season is going on in various colleg ...
- [LeetCode] Gas Station 贪心
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- 修饰符的范围+运算符优先级+构造方法特点+switch参数
一.修饰符的范围 修饰符的范围,是否可访问: 类型 private 无修饰 protected public 同一类 是 是 是 是 同一包中的子类 否 是 是 是 同一包中的非子类 否 是 是 是 ...
- git使用代理clone加速
不设置代理10kb/s不到....,设置后,500kb/s左右跑- 开shadowsocks,代理127.0.0.1:1080 编写一个脚本 /YOUR PATH/gitproxy.sh #!/bin ...
- viewpager+fragment出现TransactionTooLargeException的大坑!!!
最近apk包发给部分测试用户,反馈出现很多崩溃,异常是android.os.TransactionTooLargeException,看表面意思就是传送的数据太大,可是检查代码并没有传输很大的数据啊. ...
- 洛谷 P1478 陶陶摘苹果(升级版)【贪心/结构体排序/可用01背包待补】
[链接]:https://www.luogu.org/problemnew/show/P1478 题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他 ...
- dhlin-vim-wiki
记录vim中常用的几个操作 入门指南 $ vimtutor vim中是区分大小写 vim中移动光标 h 向左移动 j 向下移动 k 向上移动 l 向右移动 其实使用方向键也是能移动的,但是熟悉后再一些 ...