2

我有一个我正在尝试使用 jdbc 执行的 oracle 查询。以下是查询。

insert into bd_vehicles_temp select * from bd_vehicles_temp_1

表 bd_vehicles_temp_1 包含大约 7000-10000 行。如果 bd_vehicles_temp_1 中的主键已经存在于 bd_vehicles_temp 中,我会得到一个 SQLException:唯一键约束。

异常行在pstmt.executeUpdate()我的代码中是偏离的。有没有办法查明 bd_vehicles_temp_1 中导致异常的行。

还是我必须遍历 bd_vehicles_temp_1 中的行并一一插入每一行?

提前致谢 !

4

3 回答 3

7

找出导致问题的行的唯一方法(我知道)是使用 Oracle 的“将错误记录到”功能。这样insert就不会抛出异常,并且任何违反任何约束的行都将被写入指定的错误表中。

为此,您首先需要创建一个包含被拒绝行的日志表:

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');

这将创建一个名为ERR$_BD_VEHICLES_TEMP

然后运行将您的语句更改为:

insert into bd_vehicles_temp 
select * 
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;

即使一行未能验证约束,该语句仍将继续。语句完成后,您可以检查表的内容以查找ERR$_BD_VEHICLES_TEMP违反约束的行,包括错误消息和值。

(编辑):如果您想在第一个错误处停止(并在日志表中查看),则省略该REJECT LIMIT UNLIMITED子句。

更多细节在手册中:

于 2013-08-27T06:23:39.883 回答
2

如果您知道可能导致异常的列,则可以使用(特定于 Oracle)

SELECT col FROM bd_vehicles_temp
INTERSECT
SELECT col FROM bd_vehicles_temp_1;

识别两个表中的所有行。

于 2013-08-27T06:06:43.643 回答
2

您正在尝试插入表格吗?您应该使用pstmt.executeUpdate()而不是pstmt.execute(). 如果您的表中已经存在记录,那么最好删除所有行并在此语句多次执行时再次添加。

于 2013-08-27T06:07:59.307 回答