【问题标题】:3 level nested loop query wont run outer loop3级嵌套循环查询不会运行外循环
【发布时间】:2011-08-25 02:24:59
【问题描述】:

我有 3 级嵌套循环,它应该执行一个查询,是一个更大的 web 服务的一部分,但问题是最外面的循环只执行了一半的代码如下:

       PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) values (?, ?, ?, ?, ?, ?)");


              if(sexarra.length == 2){

                  for(int k=0; k<sexarra.length; k++)  {
                    for(int i=0; i<selec.length; i++){
                      for(int j=0;j<sintom.length;j++){

                        ps.setString(1, malattia);
                        ps.setInt(2, eta);
                        ps.setString(3, descrizione);
                        ps.setString(4, sexarra[k] );
                        ps.setString(5, selec[i]);
                        ps.setString(6, sintom[j]);
                        ps.executeUpdate();
                      }
                    }
                  }
             }
              else {

                  for(int i=0; i<selec.length; i++){
                        for(int j=0;j<sintom.length;j++){

                        ps.setString(1, malattia);
                        ps.setInt(2, eta);
                        ps.setString(3, descrizione);
                        ps.setString(4, sexarra[0] );
                        ps.setString(5, selec[i]);
                        ps.setString(6, sintom[j]);
                        ps.executeUpdate();

                       }

                  }                   
                 }

                ps.close();
                 //ds.close();
                conn.close();
                ris = "si";
              } catch (SQLException e) {
                    System.out.println("Errore: " + e.getMessage());

                    return ris;
              }
        }
        return ris;
}

问题在于sexarra.lengh=2 的第一部分,恰好在最外层的循环中,它应该迭代两次,但是一旦与 k=0 相关的循环完成,什么程序就会抛出异常,我的意思是它不执行与K=1 相关的循环。几天来,我一直遇到嵌套循环和preparedstatement 的问题,这是最新的问题,我不知道我做错了什么。感谢大家的时间和精力。

【问题讨论】:

  • 您能否正确格式化您的代码以便我们更好地阅读?另外,您是说抛出异常吗?在这种情况下,也请把例外作为问题的一部分。
  • 而 0 个接受的答案(共 8 个)并不是很鼓舞人心。
  • @momo 我只知道抛出异常是因为 catch(SQLException e) 已激活,但我没有完全看到异常,因为此代码在 Web 服务的服务器端运行,仅"ris" 返回到客户端。
  • @Nikita,我在注册和用户名方面遇到了一些问题,当我第一次开始使用该网站时,几乎所有问题都是旧问题,不知道它是如何工作的,但我确实给出了我最终如何反馈解决了问题,现在我再次使用旧用户名,我仍然没有权利选择自己的答案作为解决方案。
  • O(n^3) 的运行时间。我相信它很可怕。但似乎你需要它:(

标签: java mysql sql jdbc nested-loops


【解决方案1】:

我还没有尝试你程序的逻辑,但我建议你看看Reusing a PreparedStatement multiple times

我从来没有用过不重新抓取实例就重置prepared statement参数的情况(poolpreparedstatement可以用来缓存statement)。这可能是这里的问题

【讨论】:

  • 我需要运行preparedstatement (sintom.lenghselec.length)*sexarra.length 次,其中sexarra.length==2。但是外部循环只会运行一半的时间(sintom.lengthselec.length)*1 次。
  • 我的建议是在每次 ps.update 之后关闭并加载准备好的语句。
  • 谢谢,但我解决了这个问题。直到明天我才能将其标记为已回答,因为它不允许我这样做。
【解决方案2】:

我通过查看服务器日志找到了答案,由 cmets 中的@Stephen C 建议,错误是由于拒绝执行查询引起的,外部循环传递了不同的值而其他值保持不变,但是外部传递的值不包含表的主键,因此查询实际上是重复的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多