当前位置: 首页 > 知识库问答 >
问题:

而循环在ResultSet之后终止。执行[复制]

祁兴运
2023-03-14

我试图通过基于TABLE COMPA对TABLE COMPB进行更新和删除操作,使TABLE COMPB等效于TABLE COMPA。代码在生成正确的SQL时工作得非常好。问题是,当循环在第一次迭代中终止时,我将execute语句放在下面的那个一刻。无法理解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);
             }  


        }

共有3个答案

江睿
2023-03-14

根据下面的建议,我通过创建准备语句对象来更改循环。

         while(seta.next())
        { 

            boolean contains=ArrayUtils.contains(ID, seta.getInt(1));

            if (contains==true)
             { 


                PreparedStatement update_stmt =con.prepareStatement("Update COMPB SET COMPB.EMPNAME=?,COMPB.EMAILID=? where COMPB.EMPID=?");
                update_stmt.setInt(3,seta.getInt(1));
                update_stmt.setString(1,seta.getString(2));
                update_stmt.setString(2,seta.getString(3));
                int k=update_stmt.executeUpdate();  
                System.out.println(k+" records updated");

             }
            else 
             {

            PreparedStatement insert_stmt =con.prepareStatement("insert into COMPB values(?,?,?)");
            insert_stmt.setInt(1,seta.getInt(1));
            insert_stmt.setString(2,seta.getString(2));
            insert_stmt.setString(3,seta.getString(3));
            int k=insert_stmt.executeUpdate();  
            System.out.println(k+" records inserted"); 

             }  


        }
吉毅
2023-03-14

无法理解java中ResultSet的这种行为。

您可以使用相同的准备声明stmt实例来执行更新:

ResultSet seta=stmt.executeQuery("select * from COMPA minus select * from COMPB");

while(seta.next()){ 
    ...

   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);
   ...
  }

您的ResultSet seta来自准备声明stmt实例。
所以我认为在准备声明实例上调用另一个执行方法对准备声明返回的先前ResultSet对象有副作用实例。

您应该创建一个新的PreparedStatement实例来执行其他查询。

狄飞鹏
2023-03-14

可能有两个原因:

    使用相同的代码> STMT 对象:将结果集对象映射到返回的语句(通过<代码> ExcExtQueQue>代码>方法),并在迭代中间重新使用相同的语句对象将使结果集无效。您应该创建一个新的语句对象,并使用它执行这些查询
 类似资料:
  • 运行这段代码,我希望它增加测试变量5秒,然后完成。 然而,当我运行它时,程序并没有结束(我假设,我已经给了它合理的时间)。然而,如果我将while循环改为 程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?

  • 您的Google Maps代码结构如下所示: 回调? JavaScriptpromise? 您能想到的其他方法吗? 同样,这里所建议的信号量是一种可行的方法吗?

  • 在我的spring boot应用程序中,我有一个组件,它有一个方法,在下面的无限循环中运行一些作业,实际上它检查数据库中的一些数据:

  • 我有一个包含以下内容的Java8流循环:

  • 问题内容: 如何防止gnome-terminal退出给定命令后退出? 我正在从cronjob调用gnome-terminal,以创建用户可访问的终端。最初为终端提供了要运行的特定程序。例如 这很好,除了退出“ myprog”时,gnome-terminal也是如此。我如何保持它运行,而只是回到终端提示符? 问题答案: 尝试这个: