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()
页:
[1]