如何在执行sql loader命令时发生错误时回滚?

时间:2014-05-13 15:04:06

标签: sql database oracle

如果在加载此文件时

$ 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 )

2 个答案:

答案 0 :(得分:3)

您无法从SQL * Loader回滚,它会自动提交。这在errors parameter description

中提到
  

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

还有a section on interrupted loads

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

答案 1 :(得分:2)

尝试使用ERRORS = 0.

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

错误(允许的错误)

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

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

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

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