这几天遇到一个需要批量更新操作的需求,让我也很头疼。有哪位大神给帮帮忙,具体是这样的:update user u set u.username='小花' where u.id='1';
update user u set u.username='小明' where u.id='2';
update user u set u.username='小李' where u.id='3';
update user u set u.username='小王' where u.id='4;
......类似这样的操作。
目前我的解决方案是这样的begin
update user u set u.username='小花' where u.id='1';
update user u set u.username='小明' where u.id='2';
update user u set u.username='小李' where u.id='3';
update user u set u.username='小王' where u.id='4;
......;
end;但是这样有很多的问题,效率方面不知道怎样先不说,但是不返回所影响的行数。不知道有没有更好的sql语句。是oracle数据库。
如果对ibatis很熟悉的大神最好帮帮忙,想想ibatis里面应该怎么写。我现在是这样的:<update id="batchUpdate" parameterClass="list">
begin
<iterate conjunction="">
update user u set u.username=#[].username# where u.id=#[].id#;
</iterate>
end;
</update>这样确实可以批量修改,但是返回值永远是-1,而且效率方面也不知道怎样,因为是批量所以必须考虑效率问题

解决方案 »

  1.   

    是不是可以用存储过程,传值Name,ID|Name,ID,存储过程for循环,记录修改成功条数
      

  2.   


    存储过程是怎么实现的啊,大概给个代码片段,还有怎么返回影响行数,麻烦稍微具体点
    1、度娘找个Oracle实现的split函数(oracle木有自带的split函数,是通过自定义函数实现的)
    2、for循环遍历split函数,然后再通过都号截取,分别把每一行的Name和ID读取到
    3、执行update操作,通过exception或者sql%rowcount判断是否执行成功
      

  3.   

    declare
     i number;
     j number;
    begin
    i := 1;
    j := 0;
    select count(*) into j from T1;
    loop
    exit when i > j;
    update T1 set T1.Subobject_Name = (select T2.Subobject_Name from T2 where T1.ID = T2.ID)
    where T1.ID >= i and T1.ID <= (i + 1000);
    i := i + 1000;
    commit;
    end loop;
    end;不知道你的原始数据怎么来的,这样写的话,原始数据需要先保存到一张表中,如果需要确保数据完全正确的插入到表中,你需要加上exception模块,判定如果出现错误怎么处理
      

  4.   

    一、使用union all
    insert into test(a,b) 
    select 'a1','b1' from dual
    union all
    select 'a2','b2' from dual
    ;二、使用insert all into插入多条数据
    insert all into test(a,b) values('a1','b1')
               into test(a,b) values('b1','b2') 
    select 1 from dual;