oracle数据库批量更新update操作

时间:2021-04-14 08:16:06
这几天遇到一个需要批量更新操作的需求,让我也很头疼。有哪位大神给帮帮忙,具体是这样的:

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,而且效率方面也不知道怎样,因为是批量所以必须考虑效率问题

6 个解决方案

#1


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

#2


引用 1 楼 lovelj2012 的回复:
是不是可以用存储过程,传值 Name,ID|Name,ID,存储过程for循环,记录修改成功条数


存储过程是怎么实现的啊,大概给个代码片段,还有怎么返回影响行数,麻烦稍微具体点

#3


引用 2 楼 Java_zero 的回复:
Quote: 引用 1 楼 lovelj2012 的回复:

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


存储过程是怎么实现的啊,大概给个代码片段,还有怎么返回影响行数,麻烦稍微具体点

1、度娘找个Oracle实现的split函数(oracle木有自带的split函数,是通过自定义函数实现的)
2、for循环遍历split函数,然后再通过都号截取,分别把每一行的Name和ID读取到
3、执行update操作,通过exception或者sql%rowcount判断是否执行成功

#4


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模块,判定如果出现错误怎么处理

#5


一、使用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;

#6


参数值用一个绑定变量去传,应该会快些

#1


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

#2


引用 1 楼 lovelj2012 的回复:
是不是可以用存储过程,传值 Name,ID|Name,ID,存储过程for循环,记录修改成功条数


存储过程是怎么实现的啊,大概给个代码片段,还有怎么返回影响行数,麻烦稍微具体点

#3


引用 2 楼 Java_zero 的回复:
Quote: 引用 1 楼 lovelj2012 的回复:

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


存储过程是怎么实现的啊,大概给个代码片段,还有怎么返回影响行数,麻烦稍微具体点

1、度娘找个Oracle实现的split函数(oracle木有自带的split函数,是通过自定义函数实现的)
2、for循环遍历split函数,然后再通过都号截取,分别把每一行的Name和ID读取到
3、执行update操作,通过exception或者sql%rowcount判断是否执行成功

#4


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模块,判定如果出现错误怎么处理

#5


一、使用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;

#6


参数值用一个绑定变量去传,应该会快些