Oracle數(shù)據(jù)庫(kù)更新大批量數(shù)據(jù)案例
更新大批量數(shù)據(jù)的背景:
用戶(hù)需要將VIP的微信標(biāo)識(shí),傳給用戶(hù)的ERP會(huì)員檔案中,已知存量數(shù)據(jù)約50W行數(shù)據(jù),線(xiàn)下的微信標(biāo)識(shí)數(shù)據(jù)我們開(kāi)發(fā)提供了openid和erpid的csv文件,erpid和線(xiàn)下的會(huì)員檔案id對(duì)應(yīng),需要將openid也更新到會(huì)員檔案里。
更新數(shù)量大致分為兩大步驟
一、將我們要更新的數(shù)據(jù)源導(dǎo)入數(shù)據(jù)庫(kù)內(nèi),需要?jiǎng)?chuàng)建臨時(shí)表,將數(shù)據(jù)傳入臨時(shí)表
二、寫(xiě)游標(biāo),將臨時(shí)表內(nèi)的數(shù)據(jù)與需要更新的數(shù)據(jù)進(jìn)行更新
1.將csv文件里面的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)臨時(shí)表中,先創(chuàng)建臨時(shí)表
create table vip_openid (erpid number(10), openid varchar(200) )
2.臨時(shí)表創(chuàng)建后,將cvs文件里的數(shù)據(jù)導(dǎo)入表中,在這里我們選擇工具>文本導(dǎo)入器
選擇要導(dǎo)入的csv文件,注意csv文件的表字段和數(shù)據(jù)庫(kù)表字段對(duì)應(yīng)
選擇文件后在界面將會(huì)預(yù)覽導(dǎo)入的數(shù)據(jù)
3.點(diǎn)擊到oracle的數(shù)據(jù),選擇導(dǎo)入的表,先選擇用戶(hù)名,用戶(hù)名下的表名,然后選擇表與csv文件表字段對(duì)應(yīng)關(guān)系,我們選擇導(dǎo)入,可以看到提示導(dǎo)入完成。
4.接下來(lái)就是對(duì)會(huì)員表和臨時(shí)表的數(shù)據(jù)關(guān)聯(lián)更新,我們先使用直接update方式進(jìn)行更新試驗(yàn),該方法只更新5W數(shù)據(jù),耗時(shí)12分鐘左右:
于是參考百度文檔建議,寫(xiě)了一個(gè)游標(biāo)如下
declare cursor cur is--聲明游標(biāo)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對(duì)應(yīng)的openid,并對(duì)游標(biāo)內(nèi)數(shù)組排序 V_COUNTER NUMBER;--聲明一個(gè)number類(lèi)型的變量 BEGIN V_VOUNTER:=0;--初始化變量值為0 FOR ROW IN CUR LOOP--遍歷游標(biāo) UPDATE C_CLIENT_VIP A SET A.OPENID=ROW.OPENID WHERE A.ID=ROW_ID; V_COUNTER:=V_COUNTER+1;--每次循環(huán)變量值+1 IF(V_COUNTER>=1000) THEN COMMIT; V_COUNTER:=0;--每更新1000行,V_COUNTER值為1000時(shí)候,就提交給數(shù)據(jù)庫(kù) 提交后將變量歸零,繼續(xù)下一個(gè)1000行更新 END IF; END LOOP; COMMIT; END;
大概48W行數(shù)據(jù),43秒即更新完畢。
使用以上方式注意一點(diǎn),因?yàn)閿?shù)據(jù)庫(kù)會(huì)員表的ID有索引,所以使用游標(biāo)速率很快。如我們的多表關(guān)聯(lián)字段沒(méi)有索引,使用此方式可能效果不是很明顯。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Oracle監(jiān)聽(tīng)器服務(wù)不能啟動(dòng)的解決方法
這篇文章主要介紹了Oracle監(jiān)聽(tīng)器服務(wù)不能啟動(dòng)的解決方法,需要的朋友可以參考下2014-07-07Oracle實(shí)現(xiàn)分頁(yè)三種不同的方式
這篇文章主要給大家介紹了關(guān)于Oracle實(shí)現(xiàn)分頁(yè)三種不同的方式,oracle分頁(yè)與MySQL不同,MySQL是用關(guān)鍵字limit進(jìn)行分頁(yè),oracle是根據(jù)行號(hào),需要的朋友可以參考下2023-08-08Oracle 11g2的監(jiān)聽(tīng)器配置教程
Oracle的監(jiān)聽(tīng)器服務(wù)注冊(cè)方式有兩種,分別為動(dòng)態(tài)和靜態(tài),本文將詳細(xì)介紹這兩種,需要的朋友可以參考下2012-11-11oracle臨時(shí)表空間的作用與創(chuàng)建及相關(guān)操作詳解
Oracle可能會(huì)需要使用到一些臨時(shí)存儲(chǔ)空間,用于臨時(shí)保存解析過(guò)的查詢(xún)語(yǔ)句以及在排序過(guò)程中產(chǎn)生的臨時(shí)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于oracle臨時(shí)表空間的作用與創(chuàng)建及相關(guān)操作的相關(guān)資料,需要的朋友可以參考下2022-07-07oracle11g客戶(hù)端連接12c服務(wù)器ORA-01017錯(cuò)誤問(wèn)題解決
這篇文章主要介紹了oracle11g客戶(hù)端連接12c服務(wù)器ORA-01017錯(cuò)誤,本文給大家分享完美解決方法,對(duì)oracle 12c錯(cuò)誤ORA-01017問(wèn)題解決方法感興趣的朋友跟隨小編一起看看吧2023-06-06Kettle連接Oracle數(shù)據(jù)庫(kù)方法((Oracle19c&Oracle11g))
這篇文章主要介紹了Kettle連接Oracle數(shù)據(jù)庫(kù)方法((Oracle19c&Oracle11g)),包括oracle驅(qū)動(dòng)jar包,連接oracle的過(guò)程,思路很簡(jiǎn)單需要的朋友可以參考下2022-11-11