程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> update更新多行數據(oracle)

update更新多行數據(oracle)

編輯:Oracle教程

update更新多行數據(oracle)


說明:筆記總結了在工作中遇到過的幾種update方法和各種方法適用的范圍。   1.單表更新 方案:使用標准update語法即可,執行穩定且效率較高 update table set (column1,column2,...)= value1,value2,... ;   2.多表關聯更新 舉例:更新gkfq_rec表中所有slid與oa2_ftask表fi_inst相同的行,blzt字段值=oa2_ftask表的ft_lstate。  
create table gkfq_rec (

slid char(12) parimary key,

blzt varchar2(50),

wjbt varchar2(100) not null,

........

);

create table oa2_ftask (

fi_inst char(12) parimary key,

fi_state int not null,

ft_lstate int not null,

...

);

 

 方法描述

 適用范圍

 運行效率

 傳統方案  一般情況適用  單表更新效率高且穩定,多表時效率較慢  inline view更新法  關聯字段為主鍵  速度較快  merge更新法  關聯字段非主鍵,適用於兩表關聯  非主鍵關聯表更新,速度較快  快速游標更新法  邏輯較復雜的情況  復雜邏輯時效率很高     (1)傳統方案(速度可能最慢)
update gkfq_rec a 
set blzt=
(select b.ft_lstate from oa2_ftask b where a.slid=b.fi_inst)
where exists
(select 1 from oa2_ftask b where a.slid=b.fi_inst)
;

//子查詢返回多行值時,通過where exists條件逐行過濾,一一匹配實現set唯一值

 

  (2)inline view更新法(關聯主鍵字段,速度較快) 方案:更新一個臨時建立的視圖。要求B表的主鍵字段必須在where條件中,並且是以=號來關聯被更新表,否則可能報錯:ORA-01779:無法修改與非鍵值保存表對應的列。當B表主鍵字段為多列組合時,也有可能出現這一報錯。update (select a.blzt as blzt,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst)  set blzt=ft_lstate ;   (3)merge更新法(關聯字段非主鍵時,速度較快) 語法:
MERGE INTO table_name alias 1
USING (table|view|sub_query) alias 2
ON (join condition)
WHEN MATCHED THEN
UPDATE 
SET col1=col_val1,
    col2=col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);

 

  方案:在alias2中select出來的數據,每一條都跟alias1進行ON (join condition)比較,若匹配,就進行更新操作,不匹配,執行插入操作。merge不會返回影響行數,且最多只能兩表關聯,適用於連接條件不是主鍵的字段。
merge into gkfq_rec a
using oa2_ftask b
on (a.slid=b.fi_inst)
when matched then
update set a.blzt=b.ft_lstate;

 

  (4)快速游標更新法(復雜邏輯時,效率很高) 語法: begin for cr in (查詢語句) loop  --循環 update table_name set ...   --更新語句(根據查詢出來的結果集合) end loop;  --結束循環 end;   方案:配合oracle獨有的內置ROWID物理字段,使用快速游標,不需要定義,直接把游標寫到for循環中,快速定位並執行更新。它可以支持復雜邏輯的查詢語句,更新准確,無論數據多大更新效率依然很高。但執行後不返回影響行數。
begin
for aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask b
where a.slid=b.fi_inst ) loop
update gkfq_rec set blzt=aa.ft_lstate
where rowid=aa.rowid;
end loop;
end;

 

update更新多行數據(oracle)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved