2010-11-25 54 views
2

我有兩個Oracle表,一箇舊的和一個新的。 舊的設計很糟糕(比我的更重要,介意你),但有很多當前的數據需要遷移到我創建的新表中。轉換一個Oracle表(數據)以填充稍微不同的Oracle表的最佳方式是什麼?

新表格有新的列,不同的列。

我想到的只是寫一個PHP腳本或東西有一大堆的字符串替換的......清楚,是一個愚蠢的方式做到這一點,雖然。

我真的很希望能夠清理數據有點沿途爲好。一些它存儲了標記(例如:「
名字
」),大量的空白空間等,所以我真的想在修復所有這些問題之前把它放到新表中。

有沒有人有這樣的經驗嗎?我該怎麼辦?

謝謝:)

+0

問題是你是否在尋找一個數據清理工具或INSERT ... SELECT ...以及一堆函數,正則表達式等等。你在說什麼類型的數據量(兆字節,千兆字節或千兆字節)。 – 2010-11-25 23:50:18

回答

0

如果數據量不是很大,如果你只打算這麼做一次,那麼它將很難打敗自己動手的計劃。特別是如果你有一些你需要實現的自定義邏輯。 下載所花費的時間,學習&使用工具(如pentaho等)可能不值得您購買。

編寫一個SELECT *,在內存&更新列做一個INSERT INTO將在PHP或任何其他編程語言迅速完成。

話雖這麼說,如果你發現自己經常這樣做,那麼ETL工具可能是值得學習的。

7

我這個做相當多的 - 你可以簡單的選擇statememt遷移:

create table newtable as select 
field1, 
trim(oldfield2) as field3, 
cast(field3 as number(6)) as field4, 
(select pk from lookuptable where value = field5) as field5, 
etc, 
from 
oldtable 

這確實非常小,你可以用中間語言如PHP,等等,你不能在本地SQL做做當涉及到清理和轉換數據時。

對於更復雜的清理工作,你總是可以創建一個SQL函數,它繁重,但我已經清理了一些非常可怕的數據,而無需訴諸這一點。不要在Oracle不會忘記你有解碼,case語句等

0

我工作的一個類似的項目我自己 - 從包含幾十個表對錶的類似數量的有所不同模型中的一個模型數據遷移。

我已經採取了爲每個目標表創建MERGE語句的方法。源查詢獲取所需的所有數據,根據需要對其進行格式化,然後如果該行已存在並根據需要進行更新/插入,則合併就會結束。這樣,我可以在開發解決方案時多次運行該語句。

0

取決於轉換過程的複雜程度。如果在一個SQL語句中很容易表達,那麼您已經設置好了;只需創建SELECT語句,然後執行CREATE TABLE/INSERT語句。但是,如果您需要執行一些複雜轉換或(顫抖)拆分或合併任何行以正確轉換它們,則應該使用流水線表函數。不過,聽起來並不是這樣的;儘量堅持上面提到的其他克里斯提出的單一陳述。你確實要做而不是想要將數據從數據庫中拉出來進行轉換,因爲傳入和傳出Oracle總是比將數據全部保存在數據庫中慢。

一對夫婦更提示:

  • 如果表已經存在,你正在做一個INSERT ... SELECT語句,使用/ * + APPEND * /提示就插入,這樣你在做一個批量操作。請注意,CREATE TABLE會默認執行此操作(只要有可能;在某些情況下不能執行批量操作,例如,如果新表是索引組織表,具有觸發器等等)
  • 如果您位於10.2或之後,您還應該考慮使用LOG ERRORS INTO子句將拒絕的記錄記錄到錯誤表中。這樣,如果一條記錄有您錯誤期望的錯誤,您將不會丟失整個操作。
相關問題