【发布时间】:2017-01-08 20:30:08
【问题描述】:
我试图通过基于表 COMPA 的表 COMPB 上的更新和删除操作使 TABLE COMPB 等效于 TABLE COMPA。该代码在生成正确的 SQL 时运行良好。问题是,当我将执行语句放在下面的那一刻,while 循环在第一次迭代本身中终止。无法理解 Java 中 ResultSet 的这种行为。这里有什么帮助吗?我哪里出错了?
//Comparision between Minus Table(seta) and COMPB (setc)
//ID Contains Primary Key of COMPB Table
ResultSet seta=stmt.executeQuery("select * from COMPA minus select * from COMPB");
while(seta.next())
{
String insert="";
String update="";
boolean contains=ArrayUtils.contains(ID, seta.getInt(1));
if (contains==true)
{
update="Update COMPB SET COMPB.EMPNAME='"+seta.getString(2)+"',COMPB.EMAILID='"+seta.getString(3)+"' where "+seta.getInt(1)+"=COMPB.EMPID";
stmt.executeUpdate(update);
System.out.println(update);
}
else
{
insert="Insert INTO COMPB values ("+seta.getInt(1)+" , '"+seta.getString(2)+"' , '"+seta.getString(3)+"')";
stmt.executeUpdate(insert);
System.out.println(insert);
}
}
【问题讨论】:
-
我想它不喜欢你在随后的
executeUpdate()调用中重复使用stmt,但是你做了什么调试?如果您手动运行初始查询会得到什么 - 假设所有会话中的所有更改都已提交?另外,为什么要使用循环而不是单个合并语句?如果必须使用循环,为什么不使用准备好的语句和绑定变量? -
谢谢亚历克斯。在循环中重用 stmt 是个问题。我还不明白它如何打破while循环。但现在我纠正了它。
-
我强烈建议您停止将值连接到查询字符串中,而是使用带有参数占位符的准备好的语句。您当前的代码不安全且易受 SQL 注入攻击。
-
@MarkRotteveel & all:感谢所有有经验的建议和花时间来完成我的小查询,尽管您的日程很忙。给了我很大的动力!
标签: java oracle jdbc while-loop executequery