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

时间:2011-08-08 15:47:37

标签: java sql oracle while-loop resultset

我使用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();
}

4 个答案:

答案 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()