当一个DML运行的时候,如果遇到了错误,则这条语句会整个回滚,就好像没有执行过。不过对于一个大的DML而言,如果个别数据错误而导致整个语句的回滚,会浪费很多的资源和运行时间,从10g开始Oracle支持记录DML语句的错误,而允许语句自动继续执行。下面介绍一下DML记录语句的用法。

看一个插入语句的简单例子:

SQL> CREATE TABLE T1 AS SELECT ROWNUM A,ROWNUM B FROM DBA_SEGMENTS WHERE ROWNUM <=10;
Table created
SQL> CREATE TABLE T2 AS SELECT ROWNUM A,ROWNUM B FROM DBA_SEGMENTS WHERE ROWNUM <=20;
Table created
SQL> ALTER TABLE T1 ADD CONSTRAINT PK_T1_A PRIMARY KEY(A);
Table altered
SQL> INSERT INTO T1 SELECT * FROM T2;
INSERT INTO T1 SELECT * FROM T2
ORA-00001: 违反唯一约束条件 (NREI.PK_T1_A)

可以看到,由于插入的数据违反了唯一性约束,导致了Oracle报错。

下面创建记录DML错误信息的记录表,通过DBMS_ERRLOG包来进行创建,而这个包目前只包括这一个过程:

procedure create_error_log(dml_table_name      varchar2,
                                 err_log_table_name  varchar2 default NULL,
                                err_log_table_owner varchar2 default NULL,
                                err_log_table_space varchar2 default NULL,
                                skip_unsupported    boolean  default FALSE);

利用CREATE_ERROR_LOG来创建T1表的DML错误记录表:

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

PL/SQL procedure successfully completed

可以看到Oracle创建的错误记录表包括错误号码ORA_ERR_NUMBER$,错误信息ORA_ERR_MESG$,记录的ROWID信息ORA_ERR_ROWID$,错误操作类型ORA_ERR_OPTYP$,错误标签ORA_ERR_TAG$,以及表中对应的列。

下面利用包含LOG ERROR语句的INSERT语句再次插入数据:

SQL> INSERT INTO T1 SELECT * FROM T2 LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT UNLIMITED;
10 rows inserted

可以看到,插入成功执行,但是插入记录为10条。从对应的错误信息表中已经包含了插入的信息。而且从错误信息表中还可以看到对应的错误号和详细错误信息,ORA_ERR_OPTYP$为错误操作类型,I表示为Insert

关于LOG ERRORS的语法,INTO语句后面跟随的就是指定的错误记录表的表名。

在INTO语句后面,可以跟随一个表达式('ERR_T1')即是ORA_ERR_TAG$中存储的信息,用来设置本次语句执行的错误在错误记录表中对应的TAG。有了这个语句,就可以很轻易的在错误记录表中找到某次操作所对应的所有的错误,这对于错误记录表中包含了大量数据,且本次语句产生了多条错误信息的情况十分有帮助。只要这个表达式的值可以转化为字符串类型就可以。

而REJECT LIMIT则限制语句出错的数量。

SQL> INSERT INTO T1 SELECT * FROM T2 LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT 1;
INSERT INTO T1 SELECT * FROM T2 LOG ERRORS INTO ERR_T1('ERR_T1')REJECT LIMIT 1
ORA-00001: 违反唯一约束条件 (NREI.PK_T1_A)

可以看到,当设置的REJECT LIMIT的值小于出错记录数时,语句会报错,这时LOG ERRORS语句没有起到应有的作用,插入语句仍然以报错结束。而如果将REJECT LIMIT的限制设置大于等于出错的记录数,则插入语句就会执行成功。而所有出错的信息都会存储到LOG ERROR对应的表中。

只要指定了LOG ERRORS语句,不管最终插入语句十分成功的执行完成,在错误记录表中都会记录语句执行过程中遇到的错误。比如第一个插入由于出错数目超过REJECT LIMIT的限制,这时在记录表中会存在REJECT LIMIT + 1条记录数,因此这条记录错误导致了整个SQL语句的报错。

如果不管碰到多少错误,都希望语句能继续执行,则可以设置REJECT LIMIT为UNLIMITED

需要注意的是,即是做了回滚操作,ERR_T1表中的记录并不会减少,因为Oracle是利用自治事务的方式插入错误记录表的。

转载于:https://www.cnblogs.com/longjshz/p/4286808.html

DBMS_ERRLOG记录DML错误日志(一)相关推荐

  1. mysql dml 日志_Oracle DML错误日志笔记

    DML错误日志是Oracle 10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一 DML错误日志是Oracle 10gR2引入的一个类 ...

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

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

  3. php慢日志 格式,php慢日志记录和错误日志(转)

    php的日志是值得关注的,包含错误日志和慢日志 一 错误输出 找到php.ini log_errors = On ; Log errors to specified file. error_log = ...

  4. PHP项目中,记录错误日志

    一.场景介绍: 环境:LNMP 我们通常是通过nginx的错误日志来分析分错的,也就是我们在各个server中定义的error_log. 比如下面这样,就是将错误日志定义在/etc/nginx/log ...

  5. php出错日志记录_关于PHP错误日志踩过的一些坑

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

  6. mysql错误日志/var/log/mariadb/mariadb.log,二进制日志

    mariadb-日志 IT_luo关注0人评论65人阅读2018-10-15 08:59:03 mariadb日志 mariadb日志:1.查询日志:query log:2.慢查询日志:slow qu ...

  7. php-fpm打开错误日志的配置

    nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询. 在nginx中事情就变成了这样:nginx只对 ...

  8. 2、MySQL错误日志(Error Log)详解

    错误日志(Error Log)是 MySQL 中最常用的一种日志,主要记录 MySQL 服务器启动和停止过程中的信息.服务器在运行过程中发生的故障和异常情况等. 作为初学者,要学会利用错误日志来定位问 ...

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

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

最新文章

  1. CUDA学习笔记之 CUDA存储器模型
  2. Django web开发笔记
  3. 安全界“圣经”DBIR 报告推翻了哪些“你以为的”数据泄漏情况?
  4. cookie helper.php,CookieHelper cook crud 工具类
  5. PB数据窗口自动换下一页
  6. cmd代码表白_520你还不敢表白吗?
  7. linux上的MySQL默认端口,linux下mysql 查看默认端口号与修改端口号方法
  8. awesomium_v1.6.6_sdk 百度云下载地址
  9. exlc表格怎么换行_excel表格怎么设置文字自动换行
  10. 【您有新的未分配天赋点】网络流:从懵逼到完全懵逼
  11. RollPitchYaw傻傻分不清
  12. 数据中台的云原生机会 | 甲子光年
  13. Smiditor实现图片上传功能
  14. 如何通过域名访问服务器文件,如何通过域名访问云服务器
  15. 基于FPGA/MATLAB的偏移正交相移键控的仿真实现
  16. PHP 安装与配置及Apache关联
  17. Mac下手动安装Tex/Latex Package
  18. Java项目:JSP校园运动会管理系统
  19. python身份证识别
  20. 谷歌添加JSON格式化工具 jsonhandler

热门文章

  1. oracle数组转换字符串函数,Oracle 字符串转数组的函数
  2. python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解
  3. php实现语音留言,iPhone实现语音留言 新技能get
  4. python语音合法命名-下列哪些语句在Python中是合法的( )
  5. etl spring_山寨一个Spring的@Component注解
  6. matlab 万年历,转 计算万年历的Matlab程序
  7. kNN(k-nearest-neighbor)算法的Python实现
  8. 系统学习机器学习之参数方法(二)
  9. mysql数据库视图_MySQL数据库8(二十)视图
  10. 一年级abb式词语并造句_ABB式词语如何活学活用,家长都收藏了!