oracle批量修改多個表的數據


方法一
寫PL/SQL,開cursor
declare
 l_varID varchar2(20);
 l_varSubName varchar2(30);
 cursor mycur is select T2.Id,T2.Subobject_Name from T2;
 
begin
 open mycur; 
 loop
      fetch mycur into l_varID,l_varSubName;
      exit when mycur %notfound;
      update T1 set T1.Subobject_Name = l_varSubName where T1.ID = l_varID;
 end loop;
 close mycur;
end;
---耗時39.716s
顯然這是最傳統的方法,如果數據量巨大的話(4000萬筆),還會報”snapshot too old”錯誤退出
 
方法二.
用loop循環,分批操作
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;
end loop;
end;
--耗時0.656s,這里一共循環了10次,如果數據量巨大的話,雖然能夠完成任務,但是速度還是不能令人滿意。(例如我們將T1--大表增大到100000筆 T2--小表增大到50000筆
) 耗時10.139s
 
方法三.
--虛擬一張表來進行操作,在數據量大的情況下效率比方法二高很多
update (select T1.Subobject_Name a1,T2.Subobject_Name b1 from T1,T2 where T1.ID=T2.ID)
set a1=b1;
--耗時3.234s (T1--大表增大到100000筆 T2--小表增大到50000筆)
 
方法四.
--由於UPDATE是比較消耗資源的操作,會有redo和undo操作,在這個例子里面我們可以換用下面的方法,創建一張新表,因為采用insert比update快的多,之后你會有一張舊表和一張新表,然后要怎么做就具體情況具體分析了~~~~~
create table T3 as select * from T1 where rownum<1;
alter table T3 nologging;
insert /*+ APPEND */ into T3
select T1.* from T1,T2 where T1.ID=T2.ID;
--耗時0.398s (T1--大表增大到100000筆 T2--小表增大到50000筆)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM