如下面代码:
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分