分享

ResultSet嵌套sql查询没获取到想要的数据

Statement st =  conn.createStatement();
String sql="sql语句1"    //sql语句1

ResultSet rst=st.executeQuery(sql);

while(rst.next()){

qsql="sql语句1中的查询结果作为sql语句2的查询条件"  //sql语句2

ResultSet qrst=st.executeQuery(qsql);

        if(qrst.next()){

       //如果有数据获得数据

        }
}
......
close()
预期应该是while循环会找出所有的结果,但是while只执行了一次就结束了循环。
通过查看Statement 的API,上面特别注明了一句话:
在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
其实从Statement的原理来说,底层他还是从过游标的方式操作数据,尤其是进行查询的时候,并且还是显式游标,如果对其不能进行及时的资源释放,当运行到一定时间,数据库则会抛出异常给应用(打开的游标超过了最大值)。
现在原因已经定位到:
解决办法1:(每次查询定义 Statement )
Statement st =  conn.createStatement();
String sql="sql语句1"    //sql语句1

ResultSet rst=st.executeQuery(sql);

while(rst.next()){

qsql="sql语句1中的查询结果作为sql语句2的查询条件"  //sql语句2
Statement st1=  conn.createStatement();
ResultSet qrst=st1.executeQuery(qsql);

        if(qrst.next()){

       //如果有数据获得数据

        }
}
......
close()

解决办法2:(遍历出查询的结果)
Statement st =  conn.createStatement();
String sql="sql语句1"    //sql语句1
List l_sql = new ArrayList<>();
ResultSet rst=st.executeQuery(sql);

while(rst.next()){
       l_sql.add(rst.next())
}
for(String s_sql:l_sql){
      qsql="sql语句1中的查询结果作为sql语句2的查询条件"  //sql语句2
      Statement st1=  conn.createStatement();
      ResultSet qrst=st1.executeQuery(qsql);
     if(qrst.next()){

       //如果有数据获得数据

        }
}
......
close()

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条