zoukankan      html  css  js  c++  java
  • 在遍历ResultSet的循环中再执行SQL会发生什么(前提:同一个Statement)

    如下面代码:

    Class.forName(DBParam.Driver).newInstance();
    conn = DriverManager.getConnection(DBParam.DbUrl, DBParam.User, DBParam.Pswd);
    stmt = conn.createStatement();
    
    String sql="select *  from bigtable where rownum<10";
    
    ResultSet rs = stmt.executeQuery(sql);
    
    while (rs.next()) {
        int id = rs.getInt("id");
        
        String innerSql="update smalltable set name='aa' where id='"+id+"'";
        stmt.execute(innerSql);
    }
    
    rs.close();

    while循环中会走九次吗?

    正确答案是一次,因为在遍历ResultSet期间,创建这个ResultSet的statement处于独占状态,如果此期间再想利用statement执行sql语句,则ResultSet会被清空,因此循环中只能执行一次。而在某些Oracle系统中,会爆出“关闭的 Resultset: next”异常。

    那么要循环执行innerSql该怎么办呢?

    第一种方法是先将id放入集合中暂存起来,出了while循环再遍历集合执行innerSql;

    第二种方法是创建多个statement,让执行innerSql的statement和创建ResultSet的statement不是一个就好了。

    --END-- 2020年1月11日 23点52分

  • 相关阅读:
    Oracle数据库链Database links
    记录中文字符的烦恼
    oracle游标应用难点 sys_refcursor 和 cursor(转)
    C# Delegate类
    Oracle_merge into 中 using 后的查询表如果有参数的情况
    C# partial
    Excel快捷键
    时间格式的问题
    Ref_cursor
    .Net 引用命名空间
  • 原文地址:https://www.cnblogs.com/heyang78/p/12181586.html
Copyright © 2011-2022 走看看