update语句使用的游标问题
现有计划表A,计划汇总表B
将A表数据按条件汇总后得到B表汇总数据,在对B表进行审批后,将B表的审批数回写到A表中,原update写法:
//循环B表数据
ArrayList ar_update = new ArrayList();
for(int i = 0, len = bvos.length(); i < len ; i ++ ){
String sql = "update A set A.a1="+bvos[i].b1+",a2="+bvos[i].b2+",a3="+bvos[i].b3+...
+" where A.pk_A='"+bvos[i].pk_A+"'";
ar_update.add(sql);
}
//批处理
PubBO bo = new PubBO();
bo.updataBatchBySQL(ar_update);
但在update时,如果数据超过300条就报"超过游标最大数"错误
我知道可以修改Oracle参数,把游标最大数改大些,但不这样做,是不是可以修改一下update,让它执行时更有效率一些呢?
例如我现在的改法:
StringBuffer sb = new StringBuffer();
sb.append("update A set A.a1=(select b1 from B where B.pk_A=A.pk_A),")
.append("A.a2=(select b2 from B where B.pk_A=A.pk_A),")
.append("A.a3=(select b3 from B where B.pk_A=A.pk_A),")
.append("A.a4=(select b4 from B where B.pk_A=A.pk_A),")
.append("A.a5=(select b5 from B where B.pk_A=A.pk_A),")
.......(总共有十个数要回写)
.append("where pk_A in (");
for(int i = 0, len = bvos.length(); i < len ; i ++ ){
if( i != 0 )
sb.append( "," );
sb.append("'").append(bvos[i].getPk_A()).append("'");
}
sb.append(")");
dmo.executeUpdateSQL(sb.toString());
现在我的问题是:
1.有没有更高效的写法?本来在SQL SERVER中,可以用 update .... set ..... from ...... where ....但这种写法Oracle不支持,所以现在只能用子查询,但是如果需要更新的字段很多的话,那一个字段就是一个子查询,这样应该会很影响执行效率吧?
2.原来的写法中,最大的问题就是使用了若干个update语句,这样会对应使用若干个游标,所以会出现游标最大数的问题,如果按我现在的写法,究竟在执行的时候用了多少个游标? 按我的理解,应该是这一个语句整体使用一个游标,但在更新每行时,会用到子查询的十个游标,但这样每行执行完后,这十个游标释放了吗?到最后,总共有多少个游标呢?