1. 程式人生 > >ORACLE資料庫更新大批量資料案例

ORACLE資料庫更新大批量資料案例

更新大批量資料的背景: 使用者需要將VIP的微信標識,傳給使用者的ERP會員檔案中,已知存量資料約50W行資料,線下的微信標識資料我們開發提供了openid和erpid的csv檔案,erpid和線下的會員檔案id對應,需要將openid也更新到會員檔案裡。

更新數量大致分為兩大步驟 一、將我們要更新的資料來源匯入資料庫內,需要建立臨時表,將資料傳入臨時表 二、寫遊標,將臨時表內的資料與需要更新的資料進行更新

1.將csv檔案裡面的資料匯入資料庫臨時表中,先建立臨時表

create table vip_openid
(erpid number(10),
 openid varchar
(200) )

這裡寫圖片描述 2.臨時表建立後,將cvs檔案裡的資料匯入表中,在這裡我們選擇工具>文字匯入器 這裡寫圖片描述 選擇要匯入的csv檔案,注意csv檔案的表字段和資料庫表字段對應 這裡寫圖片描述 選擇檔案後在介面將會預覽匯入的資料 這裡寫圖片描述 3.點選到oracle的資料,選擇匯入的表,先選擇使用者名稱,使用者名稱下的表名,然後選擇表與csv檔案表字段對應關係,我們選擇匯入,可以看到提示匯入完成。 這裡寫圖片描述 4.接下來就是對會員表和臨時表的資料關聯更新,我們先使用直接update方式進行更新試驗,該方法只更新5W資料,耗時12分鐘左右: sql的update更新方式 於是參考百度文件建議,寫了一個遊標如下

declare
 cursor cur is
--宣告遊標cur select B.openid,A.ID ROW_ID FROM C_CLIENT_VIP A ,VIP_OPENID B WHERE A.ID=B.ERPID ORDER BY A.ID;--從A和B表中找到ID對應的openid,並對遊標內陣列排序 V_COUNTER NUMBER;--宣告一個number型別的變數 BEGIN V_VOUNTER:=0;--初始化變數值為0 FOR ROW IN CUR LOOP--遍歷遊標 UPDATE C_CLIENT_VIP A SET A.OPENID=ROW.OPENID WHERE A.ID=ROW_ID; V_COUNTER:=V_COUNTER+1
;--每次迴圈變數值+1 IF(V_COUNTER>=1000) THEN COMMIT; V_COUNTER:=0;--每更新1000行,V_COUNTER值為1000時候,就提交給資料庫 提交後將變數歸零,繼續下一個1000行更新 END IF; END LOOP; COMMIT; END;

這裡寫圖片描述 大概48W行資料,43秒即更新完畢。

使用以上方式注意一點,因為資料庫會員表的ID有索引,所以使用遊標速率很快。如我們的多表關聯欄位沒有索引,使用此方式可能效果不是很明顯。