資料修補一則

lnwxzyp發表於2008-11-20
今天在更新一個參數列 執行update之後發現少更新了一個欄位 在修改了條件之後接著又執行了一次
結果在檢查的時候發現 出現了問題
name欄位下出現了類似"攤分發生費發生費"這樣的名稱
這是由於執行了兩次以下update語句造成的
update p_acct_call_type_ms set name=name||'發生費',
operation_type=2,type_name='實際消費',data_source='MONTH_AGGR',operation_type1=21
where substr(acct_type_id,-1)=1 and operation_type=2 ;
commit;
由於沒有備份,加上事務已經commit,因此無法rollback,
當時第一時間想到的是for update 但是like '%發生費發生費%'之後發現有400多條
一條一條的修改將非常的耗費時間
select distinct LENGTH(name)
from p_acct_call_type_ms where name like  '%發生費發生費%'
檢查發現name欄位的不同長度有50多條,寫update語句更新顯然相比for update
手工修改效率會快很多.因此補救語句如下
update p_acct_call_type_ms set name=substr(name,1,5) where LENGTH(name)=8 and name like '%發生費發生費%';
update p_acct_call_type_ms set name=substr(name,1,6) where LENGTH(name)=9 and name like '%發生費發生費%';
......
update p_acct_call_type_ms set name=substr(name,1,55) where LENGTH(name)=58 and name like '%發生費發生費%';
執行只用了幾秒鐘時間便完成了.這裡主要用到了substr函式,根據返回字串的長度來判斷擷取的長度來達到補救的目的.
記錄下來,作為經驗教訓.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-498108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章