這幾天遇到一個需要批量更新操作的需求,讓我也很頭疼。有哪位大神給幫幫忙,具體是這樣的:
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,而且效率方面也不知道怎樣,因為是批量所以必須考慮效率問題
uj5u.com熱心網友回復:
是不是可以用存盤程序,傳值Name,ID|Name,ID,存盤程序for回圈,記錄修改成功條數uj5u.com熱心網友回復:
存盤程序是怎么實作的啊,大概給個代碼片段,還有怎么回傳影響行數,麻煩稍微具體點
uj5u.com熱心網友回復:
1、度娘找個Oracle實作的split函式(oracle木有自帶的split函式,是通過自定義函式實作的)
2、for回圈遍歷split函式,然后再通過都號截取,分別把每一行的Name和ID讀取到
3、執行update操作,通過exception或者sql%rowcount判斷是否執行成功
uj5u.com熱心網友回復:
declarei 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模塊,判定如果出現錯誤怎么處理
uj5u.com熱心網友回復:
一、使用union allinsert 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;
uj5u.com熱心網友回復:
引數值用一個系結變數去傳,應該會快些轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/85222.html
標籤:高級技術
