首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

DML Error Logging 特征

2012-08-02 
DML Error Logging 特性最近的项目中发现处理DML Error 时,逐条逐条处理1千多条的数据从临时表 insert 到

DML Error Logging 特性
      最近的项目中发现处理DML Error 时,逐条逐条处理1千多条的数据从临时表 insert 到正式表需要差不多1分钟的时间,性能相当低下,
而Oracle 10g中的DML error logging对于DML异常处理性能卓著。原本打算写篇关于这个特性的文章,正好有经典篇章,于是乎,索性翻译供大
家参考,有不尽完美之处,请大家拍砖。
      缺省情况下,一个DML命令失败的时候,在侦测到错误之前,不论成功处理了多少条记录,都将将使得整个语句回滚。在使用DML error log
之前,针对单行处理首选的办法是使用批量SQL FORALL 的SAVE EXCEPTIONS子句。而在Oracle 10g R2时,DML error log特性使得该问题得以解
决。通过为大多数INSERT,UPDATE,MERGE,DELETE语句添加适当的LOG ERRORS子句,不论处理过程中是否出现错误,都可以使整个语句成功执行。
这篇文章描述了DML ERROR LOGGING操作特性,并针对每一种情形给出示例。

一、语法
    对于INSERT, UPDATE, MERGE 以及 DELETE 语句都使用相同的语法
        LOG ERRORS [INTO [schema.]table] [('simple_expression')] [REJECT LIMIT integer|UNLIMITED]

    可选的INTO子句允许指定error logging table 的名字。如果省略它,则记录日志的表名的将以"ERR$_"前缀加上基表名来表示。

    simple_expression表达式可以用于指定一个标记,更方便去判断错误。simple_expression能够为一个字符串或任意能转换成字符串的函数

    REJECT LIMIT 通常用于判断当前语句所允许出现的最大错误数。缺省值是0,最大值则是使用UNLIMITED关键字。对于并行DML操作而言,REJECT LIMIT
        会应用到每个并行服务器。

二、使用限制
    下列情形使得DML error logging 特性失效
        延迟约束特性
        Direct-path INSERT 或MERGE 引起违反唯一约束或唯一索引
        UPDATE 或 MERGE 引起违反唯一约束或唯一索引

    除此之外,对于LONG,LOB,以及对象类型也不被支持。即使是一个包含这些列的表被作为错误日志记录目标表。

三、示例
    下面的代码创建表并填充数据用于演示。

INSERT INTO dest_child (id, dest_id) VALUES (1, 100);INSERT INTO dest_child (id, dest_id) VALUES (2, 101);DELETE FROM dest;*ERROR at line 1:ORA-02292: integrity constraint (TEST.DEST_CHILD_DEST_FK) violated - child record found--对于Delete操作,同样可以添加DML error logging子句来记录错误使得整个语句成功执行 。DELETE FROM destLOG ERRORS INTO err$_dest ('DELETE') REJECT LIMIT UNLIMITED;99996 rows deleted.--下面是Delete操作失败的日志以及错误原因。COLUMN ora_err_mesg$ FORMAT A69SELECT ora_err_number$, ora_err_mesg$FROM   err$_destWHERE  ora_err_tag$ = 'DELETE';ORA_ERR_NUMBER$ ORA_ERR_MESG$--------------- ---------------------------------           2292 ORA-02292: integrity constraint (TEST.DEST_CHILD_DEST_FK) violated -                child record found           2292 ORA-02292: integrity constraint (TEST.DEST_CHILD_DEST_FK) violated -                child record found2 rows selected.
四、后记
        1、DML error logging特性使用了自治事务,因此不论当前的主事务是提交或回滚,其产生的错误信息都将记录在对应的日志表。
        2、DML error logging使得错误处理得以高效实现,尽管如此,如果在操作中,很多表需要DML操作,尤其是数据迁移时,使得每一个表都
                需要创建一个对应的日志表。做了一个测试,可以将日志表的一些基表列删除,保留主要列,日志依然可以成功记录以缩小日志大小。
        3、能否将多张日志表合并到一张日志表,然后每一行数据中添加对应的表名以及主键等信息以鉴别错误,这样子的话,仅仅用少量的日志
                表即可实现记录多张表上的DML error。这个还没有来得及测试,This is a question。

热点排行