我们可以在java中遍历结果集时执行一些查询吗



我正试图在java中使用类似JDBC的SQL存储过程来实现一项任务。在SQL中,当我们编写游标时,首先执行select查询,然后获取记录,我们执行一些操作。

很可能我在配置单元中激发了一个选择查询。

sql="SELECT a,c,b FROM tbl_name";
res=stmt.executeQuery();    -----------> CONTAINS 30 RECORDS
while(res.next())
{
     sql="INSERT INTO table .....";
     rs1=stmt.executeQuery();
     sql="SELECT d,e,f FROM table .....";
     rs1=stmt.executeQuery();
     like wise many queries are there.....
.
.
.
..
}

由于我的select查询包含30条记录,但当我执行它时,while(res.next())只执行一次。

但我只是尝试显示字段来检查它是否正在获取,而不是查询那么它工作得很好。。(当循环只包含System.out.println语句时)

sql="SELECT * FROM tbl_name";
res=stmt.executeQuery(sql);
while(res.next())
{
   S.O.P.("fields : "+res.getString(0));
}

(我认为,当遍历结果集时,如果在查询之间有查询,那么查询会被执行,但同时循环也会被执行。一段时间后,当查询执行结束时,结果集的循环也会结束,因此它会执行一次。我不确定。)

我不明白为什么会发生这种事。我做错了什么吗?

每个Statement一次只能有一个打开的ResultSet。来自文件:

默认情况下,每个Statement对象只能打开一个ResultSet对象同时因此,如果读取一个ResultSet对象与另一个的读取交错,每个都必须生成通过不同的Statement对象。语句中的所有执行方法如果存在一个开放的。

循环中对executeQuery的调用将隐式关闭外部ResultSet,因此您只能看到一行。

我会重组您的流程。首先,不要尝试重用同一个Statement对象来执行新查询。例如,当我尝试使用PostgreSQL驱动程序时,我很容易得到一个异常,"This ResultSet is closed"

相反,将其重写为这样的内容:

Connection conn = DriverManager.getConnection(...);
Statement outerStatement = conn.createStatement();
ResultSet outerResultSet = outerStatement.executeQuery("...");
while (outerResultSet.next()) {
    Statement innerStatement = conn.createStatement();
    ResultSet innerResultSet = innerStatement.executeQuery("...");
    while (innerResultSet.next()) {
        // ...
    }
    innerResultSet.close();
    innerStatement.close();
}
outerResultSet.close();
outerStatement.close();
conn.close();

当然,根据需要用try-catch-finally包围。

情况并非如此,您可以尝试直到您的查询被执行,循环将等待。

理想情况下,在一个数据库连接上一次只能执行一条语句,因此您可以创建并执行第二条语句,也可以迭代第一条语句的结果集并将数据存储在集合中(例如,在hashmap的arraylist中),然后关闭该语句并运行第二条,这一次从您保存的集合中检索id。

相关内容

  • 没有找到相关文章

最新更新