【工具準備】(版本僅爲本人實際操作時使用,僅供參考)
DbVisualizer V6(提取informix數據)
PowerDesigner V12.5(informix數據文件向oracle轉換)
PL.SQL.Developer.v7(向oracle中導數)
Oracle 10g(客戶端即可)
UltraEdit(編輯informix數據文件中的非法格式及字符)
注:如果需要操作很大的文本文件,機器內存最好大一些,運行會比較順暢。
【數據導出】
- 在DbVisualizer中建立informix連接(步驟從略)
- 數據庫連接成功後,右單擊“Data Base”,選擇導出按鈕,選擇導出格式爲“sql”,同時勾選下邊的表結構、數據、索引、約束等;按需要我們分別導出一套含數據和一套不含數據的sql文件。
【數據庫轉換】
- 打開 PowerDesigner 12,File -> Reverse Engineer -> Database;
- DBMS選擇INFORMIX SQL 9.x(版本根據informix數據庫實際版本而定)然後點擊【確定】按鈕;
- 選擇要導入的數據結構sql文件,點擊【確認】按鈕,這樣我們從informix數據庫中導出的數據結構便導入到PowerDesigner中了;
- 數據結構導入後,我們進行數據庫變更操作 Datebase -> Change Current DBMS;
- 在new DBMS裏選擇oracle 10g,點擊確定後,PowerDesigner會將informix中導出的數據結構文件轉換成oracle可用的語法;
- 數據結構轉換完成後,我們要生成oracle可用的執行sql,並生成相應腳本文件Database -> Generate Database;
- 在【General】標籤輸入選擇生成腳本路徑及腳本文件名;
- 在【Options】標籤中將所有物理選項(Physical Options)勾選框去掉,這樣在導出文件中指定表空間的語句就會自動被去掉;
- 生成建庫sql,將【Preview】標籤下sql複製出來,做成sql文件。
【完善數據結構sql】
(以下批量替換是指:利用UltraEdit編輯器,CTRL+R,並且勾選只匹配整個詞語替換。)
- CHAR數據類型替換爲VARCHAR2;
- SMALLINT數據類型替換爲NUMBER(20);
- INTEGER數據類型替換爲NUMBER(20);
- DATETIME數據類型替換爲DATE;
- 由於“level”爲oracle保留字,需要調整字段名,比如將level字段批量替換爲****Level;
- Informix中自增序號字段轉換之後會變成非法數值,通過正則表達式替換文檔中非法數據類型,例如NUMBER(16,255)替換爲NUMBER(16,2),搜索用到的正則表達式:”^(number(^)^(*^)^(,^)^(255)^)”;
- 建表sql中的“CONSTRAINT CHECK…”調整,舉例如下:
CONSTRAINT CHECK((endhour >= 0 ),
constraint pk_** primary key (quotationno),
constraint CKT_*** check (r <= 24),
constraint Rule_11 check (24)
改爲:
CONSTRAINT CKT_****_ENDHOUR CHECK((endhour >= 0 ),
constraint pk_**** primary key (quotationno)
- 核心數據結構中的dual表需要刪除或者修改表名,因爲dual爲oracle系統表。
【在Oracle中導入數據結構及數據】
創建Oracle用戶等操作從略。
- Informix導出的sql文件完善;
- 由於informix中的null與oracle中null的定義存在差異,在導入時,需要根據執行情況,將一些在數據結構中定義爲非空的字段暫時設置爲可空:
Informix中非空的定義爲:notnull,表示空值('')或非空值(not '')
Oracle中非空的定義爲:notnull,表示非空值(not '')
- 則有類似操作
alter table tablename modify columnname null;
[以下是個人實踐中碰到問題的處理]
1.腳本整理
1.1結構替換
將類似 NUMBER(10,255) 替換爲 NUMBER(10)
將varchar 替換爲 varchar2
1.2數據替換
- 將類似TO_DATE('2010-04-07 09:41:59', '%Y-%m-%d %H:%M:%S'中的
%Y-%m-%d %H:%M:%S 替換爲 YYYY-MM-DD HH24:MI:SS
%Y-%m-%d 替換爲 YYYY-MM-DD
- 將 & 替換爲 '||'&'||'
2.在庫上執行注意點
2.1 禁用所有外鍵
執行此語句生成的腳本即可
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R';
2.2 執行腳本:如果數據量較大,建議在服務器上執行SQL腳本。
2.3 啓用所有外鍵
執行此語句生成的腳本即可
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R';
3.部分數據處理
由於部分數據值中尾部有多餘空格,需要做類似清理,下例是一般基礎數據表的清理:
update tablename set columnname=replace(columnname,' ','') ;