上一篇简单介绍了DML记录语句的限制,虽然所有的例子都是利用INSERT语句,但是LOG
ERRORS语句并没有这个限制,UPDATE、DELETE和MERGE都可以使用这个语句。下面要说的就是这篇的重点,LOG
ERRORS语句的限制。

不支持的操作:

违反延迟约束;

直接路径的INSERT或MERGE语句违反了唯一约束或唯一索引;

更新操作违反了唯一约束或唯一索引。

不支持的数据类型:

比如:LONG、LONG RAW、BLOG、CLOB、NCLOB、BFILE以及各种对象类型。Oracle不支持这些类型的原因也很简单,这些特殊的类型不是包含了大量的记录,就是需要通过特殊的方法来读取,因此Oracle没有办法在SQL处理的时候将对应列的信息写到错误记录表中。

1.下面我们来看不支持的操作,首先看一下违反延迟约束,

SQL> ALTER TABLE T1 ADD CONSTRAINT PK_T1_B CHECK (B IS NOT NULL) DEFERRABLE INITIALLY DEFERRED;

Table altered

测试语句:

SQL> INSERT INTO T1 VALUES('21','') LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

1 row inserted

SQL> commit;

commit

ORA-02091: 事务处理已回退

ORA-02290: 违反检查约束条件 (NREI.PK_T1_B)

由于延迟约束的检查在COMMIT时刻进行,而不是在DML发生的时刻,因此不会利用LOG ERRORS语句将违反结果的记录插入到记录表中,这也是很容易理解的。

下面看看直接路径插入违反唯一约束的情况:

SQL> INSERT /*+ APPEND */ INTO T1 SELECT * FROM T2 LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

INSERT /*+ APPEND */ INTO T1 SELECT * FROM T2 LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED

ORA-00001: 违反唯一约束条件 (NREI.PK_T1_A)

直接路径插入本身就很特殊,在执行过程中会绕过很多常规SQL执行的步骤,因此LOG ERRORS语句对其无效也是可以理解的。

最后来看看更新语句违反唯一约束的情况:

SQL> UPDATE T1 SET A='1' WHERE A='2' LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

UPDATE T1 SET A='1' WHERE A='2' LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED

ORA-00001: 违反唯一约束条件 (NREI.PK_T1_A)

可以看到,如果更新操作导致了唯一约束或唯一索引冲突,也是不会记录到错误记录表中的。至于为什么更新操作会产生这种情况,还没有想明白,不过主键的冲突和其他约束冲突有所区别,Oracle在处理的时候很可能会有所考虑。

2.下面我们来看不支持的数据类型

SQL> DROP TABLE
ERR_T1 PURGE;

Table dropped

SQL> alter table T1 add c clob;

Table altered

SQL> EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('T1','ERR_T1','NREI');

begin DBMS_ERRLOG.CREATE_ERROR_LOG('T1','ERR_T1','NREI'); end;

ORA-20069: Unsupported column type(s) found: C

ORA-06512: 在 "SYS.DBMS_ERRLOG", line 234

ORA-06512: 在 line 1

可以看到,由于T1表拥有不支持的列,导致创建错误记录表的过程报错,错误提示就是T1表中包含了不支持的列。

如果手工添加CLOB字段到错误记录表:

SQL> alter table T1 DROP (c);

Table altered

SQL> EXEC DBMS_ERRLOG.CREATE_ERROR_LOG('T1','ERR_T1','NREI');

PL/SQL procedure successfully completed

SQL> alter table T1 add c clob;

Table altered

SQL> alter table ERR_T1 add c clob;

Table altered

执行插入语句:

SQL> INSERT INTO T1 VALUES('21','21','TEST') LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

INSERT INTO T1 VALUES('21','21','TEST') LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED

ORA-38904: LOB 列 "C" 不支持 DML 错误事件记录

可以看到,Oracle会直接报错。

SQL> UPDATE T1 SET A='22' WHERE A='2' LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

UPDATE T1 SET A='22' WHERE A='2' LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED

ORA-38904: LOB 列 "C" 不支持 DML 错误事件记录

而Oracle的DML并不包含不支持列的数据,Oracle也会报错,说明Oracle是在执行之前检查了错误记录表的数据类型,而不是在执行的时候才去处理。

SQL> alter table ERR_T1 DROP (c);

Table altered

SQL> INSERT INTO T1 VALUES('1','1','TEST' ) LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;

0 rows inserted

可以看到,删除错误记录语句所不支持的列后,LOG
ERRORS语句反而可以顺利执行,而且无论DML语句是否包括哪些不支持列的数据。

DBMS_ERRLOG记录DML错误日志(二)的更多相关文章

  1. DBMS_ERRLOG记录DML错误日志(一)

    当一个DML运行的时候,如果遇到了错误,则这条语句会整个回滚,就好像没有执行过.不过对于一个大的DML而言,如果个别数据错误而导致整个语句的回滚,会浪费很多的资源和运行时间,从10g开始Oracle支 ...

  2. oracle DML错误日志(笔记)

    DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ER ...

  3. 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法

    最近在本地搭建的LNMP的开发环境.为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php.ini中的一些错误提示.但是这样一来,就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题 ng ...

  4. [php基础]记录PHP错误日志 display_errors与log_errors的区别

    display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利.推荐关闭此选项. display ...

  5. 记录C#错误日志工具

    在编程过程中,我们经常会用try...catch处理可能出错的代码块.如果程序出现错误,则直接show出错误信息. 当然,大型的系统都有错误日志处理模块,用数据库记录错误日志信息,有相应的写入错误日志 ...

  6. [置顶] 利用Global.asax的Application_Error实现错误记录,错误日志

    利用Global.asax的Application_Error实现错误记录 错误日志 void Application_Error(object sender, EventArgs e) { // 在 ...

  7. SQL Server 错误日志收缩(ERRORLOG)

    一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...

  8. 【夯实PHP基础】nginx php-fpm 输出php错误日志

    本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...

  9. nginx php-fpm 输出php错误日志

    nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息. nginx把对php的请求发给php-fpm fastcgi进程来处理, ...

随机推荐

  1. Windows 7更改SVN账户密码

    首先说明下我的系统是Windows7 今天更改了SVN账号和密码,然后想要更改一下Eclipse的SVN登录用户名和密码 但是网上找了一大推说什么客户端的,靠净扯淡. 本人亲测最有效的方法是删除C盘下 ...

  2. fzu Problem 2140 Forever 0.5(推理构造)

    题目:http://acm.fzu.edu.cn/problem.php?pid=2140 题意: 题目大意:给出n,要求找出n个点,满足: 1)任意两点间的距离不超过1: 2)每个点与(0,0)点的 ...

  3. 基于XMPP的即时通信系统的建立(一)— XMPP基础概念

    相关背景 IM(Instant Messaging)正在被广泛使用,特别是公司与它们的客户互动连接方案以及互联网与Web2.0相关的应用.为了解决即时通信的标准问题,IETF(互联网工程任务组 The ...

  4. UVa 11178 (简单练习) Morley's Theorem

    题意: Morley定理:任意三角形中,每个角的三等分线,相交出来的三个点构成一个正三角形. 不过这和题目关系不大,题目所求是正三角形的三个点的坐标,保留6位小数. 分析: 由于对称性,求出D点,EF ...

  5. BZOJ2337: [HNOI2011]XOR和路径

    题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i-& ...

  6. 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。

    无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败. 在Asp.Net项目中使用WebClient或HttpWebRequest时出现以上错误 解决方案:把以下代码放在 ...

  7. javascript OOP编辑思想的一个实践参考

    <html> <style type="text/css"> .current { background-color: red; } .dv { backg ...

  8. 【转】linux中wait与waitpid的差别

    原文网址:http://blog.163.com/libo_5/blog/static/15696852010324287748/ zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存 ...

  9. Android 项目利用 Android Studio 和 Gradle 打包多版本APK

    在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...

  10. c# 利用反射动态给实体类对象赋值

    转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...