最近在調(diào)整一個(gè)入庫(kù)程序,現(xiàn)在使用策略是,將所有數(shù)據(jù)全部插入到一張臨時(shí)表,然后將臨時(shí)表全表merge到正式表中,然后刪除臨時(shí)表。
實(shí)際調(diào)整中遇到了兩個(gè)問(wèn)題:
1)原來(lái)采用了批量入庫(kù),后來(lái)調(diào)整為單條入庫(kù),現(xiàn)在插入臨時(shí)表又改為批量入庫(kù),批量入庫(kù)時(shí)遇到了一個(gè)問(wèn)題就是在setString之前一定要設(shè)置字段大?。ǜ鶕?jù)數(shù)據(jù)庫(kù)建表時(shí)的字段大?。H绻麤](méi)有這么做,會(huì)報(bào)一個(gè)錯(cuò)誤?!癘RA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”。全部縷了一遍之后,還是會(huì)出現(xiàn)這個(gè)問(wèn)題,后來(lái)查了一些資料,發(fā)現(xiàn)時(shí)因?yàn)橛衏lob字段,clob字段在單條入庫(kù)時(shí)是不需要set大小的。但是在批量入庫(kù)時(shí)需要,所以要根據(jù)clob字段實(shí)際大小來(lái)設(shè)置,或者設(shè)置一個(gè)固定的最大值。我猜想這是oralce自身優(yōu)化策略,即在批量入庫(kù)時(shí),必須要設(shè)定一個(gè)大小,這樣oracle才會(huì)將所有數(shù)據(jù)完整又有效率的保存起來(lái),然后一次性插入。
2)在merge的時(shí)候也遇到一個(gè)問(wèn)題,出現(xiàn)”O(jiān)RA-30926: 無(wú)法在源表中獲得一組穩(wěn)定的行?!斑@個(gè)問(wèn)題原因比較簡(jiǎn)單,因?yàn)樵趍erge into時(shí)需要設(shè)定一個(gè)key值,會(huì)根據(jù)這個(gè)key值來(lái)決定merge into的操作(update還是insert into),所以要求在merge時(shí)這個(gè)key值是唯一的。所以要先從臨時(shí)表中選出全部數(shù)據(jù)而且key值是唯一的。語(yǔ)句實(shí)例:
select a.* from MERGE_TEST_TMP a where a.mid = (select max(MERGE_TEST_TMP.Mid) from MERGE_TEST_TMP where MERGE_TEST_TMP.MKEY=a.mkey) order by a.Mid desc;
解決完這兩個(gè)問(wèn)題,調(diào)整也就告一段落了。over!