为什么While(rs.next())语句在第一次迭代后结束?

我使用SELECT语句从表中获取数据,然后将其插入另一个表。 但是行“stmt.executeQuery(query);” 从表中插入第一行然后退出。 当我注释掉这一行时,while循环遍历打印出来的所有行。 堆栈跟踪未显示任何错误。 为什么会这样?

try{ String query = "SELECT * FROM "+schema_name+"."+table; rs = stmt.executeQuery(query); while (rs.next()) { String bundle = rs.getString("BUNDLE"); String project_cd = rs.getString("PROJECT_CD"); String dropper = rs.getString("DROPPER"); String week = rs.getString("WEEK"); String drop_dt = rs.getString("DROP_DT").replace(" 00:00:00.0",""); query = "INSERT INTO INDUCTION_INFO (BUNDLE, PROJECT_CD, DROPPER, WEEK, DROP_DT) " + "VALUES (" + bundle+"," + "'"+project_cd+"'," + dropper+"," + week+"," + "to_date('"+drop_dt+"','YYYY-MM-DD'))"; System.out.println(query); stmt.executeQuery(query); } }catch(Exception e){ e.printStackTrace(); } 

您正在重复使用用于在循环的最后一行生成rsStatement

这将关闭ResultSet rs 。 如文档中所述 :

当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时, ResultSet对象将自动关闭。

您需要使用第二个Statement对象来执行INSERT语句。

Statement对象一次只能执行一项操作,因此当您执行INSERT ,会使它生成的ResultSet无效。 您需要创建第二个Statement对象来执行INSERT

从Statement文档 :“默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个对象必须由不同的Statement对象生成如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭一个语句的当前ResultSet对象。“

如果使用相同的语句,它将使先前的结果集无效。 您应该使用不同的语句来执行更新/插入。

这是来自接口Statement的Java文档:

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。

所以你最好使用第二个Statement或更好的PreparedStatement

要执行INSERT SQL语句,您应该使用executeUpdate()而不是executeQuery()