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

时间:2012-03-16 06:37:35

标签: java resultset

我正在尝试使用JDBC(如SQL中的存储过程)在Java中实现任务。 在SQL中,当我们编写游标时,首先执行select查询,然后获取我们执行某些操作的记录。

可能我在Hive中解雇了一个选择查询。

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.....
.
.
.
..
}

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

但是我只是尝试显示字段来检查它是否正在获取而不是查询 然后它工作正常.. (while循环只包含System.out.println语句)

sql="SELECT * FROM tbl_name";
res=stmt.executeQuery(sql);

while(res.next())
{
   S.O.P.("fields : "+res.getString(0));
}

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

为什么会这样,我没有得到。我做错了什么?

4 个答案:

答案 0 :(得分:11)

每个Statement一次只能打开一个ResultSet。来自文档:

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。 Statement中的所有执行方法   如果是,接口隐式关闭一个statment的当前ResultSet对象   打开一个。

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

答案 1 :(得分:2)

我会重组你的流程。首先,不要尝试重用相同的Statement对象来执行新查询。例如,当我尝试使用PostgreSQL驱动程序时,我很容易得到一个例外,“此ResultSet已关闭。”

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

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进行环绕。

答案 2 :(得分:0)

不会发生这种情况,您可以尝试直到执行查询循环将等待。

答案 3 :(得分:0)

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