Oracle JDBC:如何知道哪一行抛出唯一键约束?

Abh*_*ngh 1 java sql oracle jdbc

我有一个oracle查询,我试图使用jdbc执行.以下是查询.

insert into bd_vehicles_temp select * from bd_vehicles_temp_1
Run Code Online (Sandbox Code Playgroud)

table bd_vehicles_temp_1包含大约7000-10000行.如果bd_vehicles_temp_1中的主键已存在于bd_vehicles_temp中,则会得到SQLException:唯一键约束.

异常的行在pstmt.executeUpdate()我的代码中是幕后的.有没有办法精确定位bd_vehicles_temp_1中导致异常的行.

或者我是否必须循环遍历bd_vehicles_temp_1中的行并逐行插入每一行?

提前致谢 !

a_h*_*ame 6

找出哪一行导致问题的唯一方法(我知道)是使用Oracle的"log errors into"功能.这样insert就不会抛出异常,任何违反任何约束的行都会被写入指定的错误表中.

要做到这一点,首先需要创建一个包含被拒绝行的日志表:

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为的表 ERR$_BD_VEHICLES_TEMP

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

insert into bd_vehicles_temp 
select * 
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
Run Code Online (Sandbox Code Playgroud)

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

(编辑):如果你想在第一个错误处停下来(并在日志表中看到),那么请省略该REJECT LIMIT UNLIMITED子句.

更多细节见手册: