【问题标题】:Can we execute some queries while traversing resultset in java我们可以在java中遍历结果集时执行一些查询吗
【发布时间】:2012-03-16 06:37:35
【问题描述】:

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

我可能在 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 条记录,但是当我执行它时,我的 while(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循环完成完成,因此它会执行一次。我不确定。)

为什么会发生我不明白。是不是我做错了什么?

【问题讨论】:

    标签: java resultset


    【解决方案1】:

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

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

    在循环内对executeQuery 的调用将隐式关闭外部ResultSet,这就是为什么您只能看到一行。

    【讨论】:

    • 我也试过了,但执行仍然相同(只执行一次。我交叉检查结果结果集本身是否包含 1 行。我检查了该查询,它给了我 30 行作为输出) .
    • 我尝试过使用不同的语句和结果集对象,但似乎内部语句执行关闭了外部结果集。当我使用新的连接对象创建内部语句时,问题就解决了。我想知道在遍历结果集时创建不同的连接对象是否可取。
    • 你可以重复使用同一个Connection对象来创建多个Statements返回多个ResultSets。
    【解决方案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 包围。

    【讨论】:

      【解决方案3】:

      不会这样,你可以尝试直到你的查询被执行循环会等待。

      【讨论】:

      • 我以前做过这种任务,很好。现在我遇到了这种问题。不知道为什么???我检查了每件事很多次,但没有得到。
      【解决方案4】:

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

      【讨论】:

      • 针对单个连接打开多个语句是完全可以的。 JDBC 只是不支持为单个Statement 打开多个ResultSets。您不需要打开一个全新的连接来进行第二次查询;只需创建一个新的Statement 并使用它。
      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 2011-11-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多