在遍历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分

原文地址:https://www.cnblogs.com/heyang78/p/12181586.html