1. 程式人生 > >Oracle幾種update語句分析

Oracle幾種update語句分析

1.單條語句更新
語法:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
說明:如果更新的欄位加了索引,更新時會重建索引,更新效率會慢。單表更新或較簡單的語句採用使用此方案更優。
2.批量資料更新
語法:update 表a set a.欄位1 = (select b.欄位1 from 表b where a.欄位2=b.欄位2) where exists(select 1 from 表b where a.欄位2=b.欄位2)
說明:查表a的所有資料,迴圈每條資料,驗證該條資料是否符合exists(select 1 from 表b where a.欄位2=b.欄位2)條件,如果是則執行(select b.欄位1 from 表b where a.欄位2=b.欄位2)查詢,查到對應的值更新a.欄位1中。關聯表更新時一定要有exists(select 1 from 表b where a.欄位2=b.欄位2)這樣的條件,否則將表a的其他資料的欄位1更新為null值。
3.merge更新法


語法:merge是oracle特有的語句,語法如下:

MERGE INTO table_name t1
USING (table|view|sub_query) t2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
        col2     = col2_val 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values); 

說明:在t2中Select出來的資料,每一條都跟t1進行 ON (join condition)的比較,如果匹配,就進行更新的操作(Update),如果不匹配,就進行插入操作(Insert)。執行merge不會返回影響的行數。Merge語句的寫法比較繁瑣,並且最多隻能兩個表關聯,複雜的語句用merge更新將力不從心且效率差。兩表關聯且被更新表不是通過關聯表主鍵關聯的,採用此方案更優。
4.利用儲存過程中游標更新


語法:

begin
for cur in (查詢語句) loop –-迴圈
	--更新語句(根據查詢出來的結果集合)
end loop; --結束迴圈
end;

說明:oracle支援快速遊標,不需要定義直接把遊標寫到for迴圈中,這樣就方便了我們批量更新資料。再加上oracle的rowid物理欄位(oracle預設給每個表都有rowid這個欄位,並且是唯一索引),可以快速定位到要更新的記錄上。使用快速遊標的好處很多,可以支援複雜的查詢語句,更新準確,無論資料多大更新效率仍然高,但執行後不返回影響行數。
多表關聯且邏輯複雜的,採用此方案更優。

上一篇:Oracle執行時報錯程式碼及資訊


下一篇:oracle資料庫的深度解析