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

我们可以在java中遍历resultset时执行一些查询吗,java,resultset,Java,Resultset,我试图用java实现一个任务,在SQL中使用类似JDBC的存储过程。 在SQL中,当我们编写游标时,首先执行select查询,然后执行一些操作获取记录 可能是我在配置单元中触发了select查询 sql="SELECT a,c,b FROM tbl_name"; res=stmt.executeQuery(); -----------> CONTAINS 30 RECORDS while(res.next()) { sql="INSERT INTO table ....."

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

可能是我在配置单元中触发了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条记录,但当我执行它时,(res.next())只执行一次

但我并没有查询,而是尝试显示字段来检查它是否正在提取 那么它工作得很好。。 (while循环仅包含System.out.println语句)

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


我不明白为什么会这样。我做错了什么吗?

不是这样的,您可以尝试,直到您的查询得到执行,循环将等待。

我将重新构造您的流程。首先,不要尝试重用相同的
语句
对象来执行新查询。例如,当我尝试使用PostgreSQL驱动程序时,我很容易得到一个异常,“ThisResultSet已关闭。”

相反,请将其改写为以下内容:

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

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

每个
语句一次只能有一个打开的
结果集。
。从文档中:

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


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

我以前做过这种任务,但很好。现在我遇到了这种问题。不知道为什么???我检查了很多次,但都没有得到。有mult完全可以iple语句是针对单个连接打开的。JDBC不支持为单个
语句打开多个
结果集。您不需要打开一个全新的连接就可以进行第二次查询;只需创建一个新的
语句
并使用它。我也尝试了这一点,但执行情况仍然相同(只执行一次。我交叉检查result-resultset本身是否包含1行。我检查该查询,它将给我30行作为输出)。我尝试过使用不同的语句和resultset对象,但似乎内部语句执行会关闭外部结果集。当我使用新的连接对象创建内部语句时,问题就解决了。我想知道在迭代结果集时是否建议创建不同的连接对象。是否可以可以重用相同的
连接
对象来创建多个
语句
返回多个
结果集
s。
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();