我使用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();
}
答案 0 :(得分:24)
您正在重复使用用于在循环的最后一行生成Statement
的{{1}}。
这将关闭rs
ResultSet
。正如stated in the documentation:
当生成它的
rs
对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet
对象会自动关闭。
您需要使用第二个Statement
对象来执行Statement
语句。
答案 1 :(得分:9)
Statement
个对象一次只能执行一项操作,因此当您执行INSERT
时,会使其生成的ResultSet
无效。您需要创建第二个Statement
对象才能执行INSERT
。
从Statement documentation:“默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个对象必须具有由不同的Statement对象生成。如果存在一个开放的对象,Statement接口中的所有执行方法都会隐式关闭一个语句的当前ResultSet对象。“
答案 2 :(得分:1)
如果使用相同的语句,它将使先前的结果集无效。您应该使用不同的语句来执行更新/插入。
答案 3 :(得分:1)
这是来自界面Statement的Java文档:
默认情况下,每个Statement对象只能打开一个ResultSet对象 在同一时间。
因此,您最好使用秒Statement
或更好PreparedStatement
。
要执行INSERT SQL语句,您应该使用executeUpdate()
而不是executeQuery()
。