【问题标题】:How to rollback when an error occurs while executing sql loader command?执行sql loader命令出错时如何回滚?
【发布时间】:2014-05-13 15:04:06
【问题描述】:

如果在加载这个文件时

$ cat employee.txt
100,Thomas,Sales,5000
200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000
501,Ritu,Accounting,5400

使用控制文件(比如)sqlldr-add-new.ctl 我知道所有记录都是错误的,所以如果今天有任何记录,我希望保留该表中先前加载的记录(昨天加载的那些)错误。如何处理这个异常。

这是我的示例 ctl 文件

$ cat sqlldr-add-new.ctl
load data
infile '/home/ramesh/employee.txt'
into table employee
fields terminated by ","
( id, name, dept, salary )

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    您不能从 SQL*Loader 回滚,它会自动提交。 errors parameter description中提到了这一点:

    在单表加载时,SQL*Loader 会在错误超过此错误限制时终止加载。但是,在该点之前插入的任何数据都会被提交。

    还有a section on interrupted loads

    您可以尝试将数据加载到临时表中,如果成功则将数据移动到真实表中(使用delete/insert into .. select ..,或者如果您有大量数据,则使用分区交换)。或者您可以使用外部表并执行相同的操作,但您需要一种方法来确定该表是否有任何丢弃或拒绝的记录。

    【讨论】:

    【解决方案2】:

    尝试使用 ERRORS=0。

    你可以在这里找到所有的解释: http://docs.oracle.com/cd/F49540_01/DOC/server.815/a67792/ch06.htm

    ERRORS(允许的错误)

    ERRORS 指定允许的最大插入错误数。如果错误数超过 ERRORS 参数的值,SQL*Loader 将终止加载。默认值为 50。要完全不允许错误,请设置 ERRORS=0。要指定允许所有错误,请使用非常高的数字。

    在单个表加载时,SQL*Loader 会在错误超过此错误限制时终止加载。但是,在该点之前插入的任何数据都会被提交。

    SQL*Loader 保持所有表中记录的一致性。因此,如果错误超过错误限制,多表加载不会立即终止。当 SQL*loader 遇到多表加载的最大错误数时,它会继续加载行,以确保之前加载到表中的有效行被加载到所有表中和/或从所有表中过滤掉的被拒绝行。

    在所有情况下,SQL*Loader 都会将错误的记录写入坏的 filz

    【讨论】:

    • “但是,在该点插入的任何数据都已提交”。不幸的是,无论使用remove 还是truncate,表中的任何现有数据都将消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多