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

Mik*_*ike 5 java sql oracle resultset while-loop

我使用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();
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 24

您正在重复使用Statement用于rs在循环的最后一行生成的内容.

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

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

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


Eli*_*ght 9

Statement对象一次只能做一件事,所以当你执行它时INSERT,你ResultSet使它生成的对象无效.您需要创建第二个Statement对象来执行INSERT.

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