這一段時間在把SQLSERVER遷移到ORASCLE,中間遇到了一系列的問題,通過查找資料和想辦法,已經基本順利解決,后面我會針對兩個數據庫遷移過程中我遇到的問題,整理匯總成一個個小問題,帶着實例編碼,給自己留個備份也同時對遇到類似問題的人做個參考。
這是第一個問題:關於sql server中的text字段如何導入的問題
在sql和oracle中,大字段的處理其實都不是很簡單,在sql中有text、ntext、binary等,2005后新增加了varchar(max)和nvarchar(max),后面增加的這兩個用起來非常爽,下面會提到;oracle中的blob、clob、nclob、nblob等類型。
下面的例子數據量不多,只有幾千條數據,但是沒有辦法通過常規的方式進行處理,下面先說明下我嘗試的過程。
1.使用常規方式,我基本采用toad的import table data的方式,具體使用很簡單在database --import中,這種方式的好處是圖形化操作,不用做字段的手工匹配,缺點是效率比較低,但是在數據量幾萬以下可以采用這種方式進行導入,比較方便。
我通過查詢出的數據復制、粘貼到excel中,假死。
2.一個字段一個字段粘貼,對1000多條的text字段操作,8G內存的機器也會在執行很長時間后,excel進程假死,不知道這算不算微軟的bug反正這樣的方式是走不通了。
3.我通過導出txt文本的方式,數據是導出了,但是在導入的時候,toad界面中的列全亂了,無法操作。
4.sql developer的text importer手工做字段匹配,也不行。
說了這么多說下最后的方式吧。
========================================================
/*關於表中存在text字段的導入oracle
1.首先在sql原表中增加autoid自增字段唯一標識記錄
2.替換text字段中的特殊字符(換行、回車、制表、逗號、單引號等)
3.先用常規方法導出非text字段然后導入(帶着autoid)
4.分別導出各自的text字段,有幾個text字段導出幾個文件(帶着autoid),並
把這些text字段導入臨時處理的對應的臨時表(需要在oracle中提前建立)
5.在oracle中通過更新的方式用autoid做關聯標識進行數據更新
6.把特殊字符替換回字段並刪除autoid
*/
----------------------sqlserver處理部分---------------------
--1.sql add autoid
alter table FORMLAYOUT add autoid int identity(1,1)
--2.export base column
select autoid,formid,nodeid,typeid,layoutname,isdefault,isdelete
from dbo.FORMLAYOUT
order by autoid
--3.repalce text info
--replace char(10) char(13)char(9)換行 回車 制表符tab
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(10),'**^^')
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(13),'^^**')
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,',',',')
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,CHAR(9),'^^^^')
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(10),'**^^')
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(13),'^^**')
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,',',',')
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,CHAR(9),'^^^^')
--4.export text1 column
select autoid,LAYOUTINFO
from dbo.FORMLAYOUT
order by autoid
--5.export text1 column
select autoid,LAYOUTFORMATTED
from dbo.FORMLAYOUT
order by autoid
----------------------oracle處理部分---------------------
--1.建立主表
CREATE TABLE "FORMLAYOUT" (
"AUTOID" number(4),
"ID" NVARCHAR2(32) NOT NULL,
"FORMID" NVARCHAR2(32),
"NODEID" NVARCHAR2(32),
"TYPEID" NUMBER(38),
"LAYOUTNAME" NVARCHAR2(256),
"ISDEFAULT" NUMBER(38),
"ISDELETE" NUMBER(38)
);
--2.建立臨時處理的表
CREATE TABLE "TMP1" (
"AUTOID" number(4) not null,
"LAYOUTINFO" NCLOB
);
CREATE TABLE "TMP2" (
"AUTOID" number(4) not null,
"LAYOUTFORMATTED" NCLOB
);
--3.通過toad導入
--4.主表創建字段並通過關聯更新
alter table FORMLAYOUT add LAYOUTINFO NCLOB;
alter table FORMLAYOUT add LAYOUTFORMATTED NCLOB;
UPDATE FORMLAYOUT
SET FORMLAYOUT.LAYOUTINFO=(SELECT TMP1.LAYOUTINFO FROM TMP1 WHERE TMP1.AUTOID=FORMLAYOUT.AUTOID) ;
UPDATE FORMLAYOUT
SET FORMLAYOUT.LAYOUTFORMATTED=(SELECT TMP2.LAYOUTFORMATTED FROM TMP2 WHERE TMP2.AUTOID=FORMLAYOUT.AUTOID) ;
--5.檢查數據
--6.替換回特殊字符,注意sql和oracle關於字符的差異一個是char一個是chr
update FORMLAYOUT
set LAYOUTINFO=REPLACE(LAYOUTINFO,'**^^',chr(10));
update FORMLAYOUT
set LAYOUTINFO=REPLACE(LAYOUTINFO,'^^**',chr(13));
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,',',',');
update formlayout
set LAYOUTINFO=REPLACE(LAYOUTINFO,'^^^^',chr(9));
update FORMLAYOUT
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'**^^',chr(10));
update FORMLAYOUT
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'^^**',chr(13));
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,',',',');
update formlayout
set LAYOUTFORMATTED=REPLACE(LAYOUTFORMATTED,'^^^^',chr(9));
--7.刪除多余表和列
alter table FORMLAYOUT drop column AUTOID;
drop table "TMP1";
drop table "TMP2";
select * from FORMLAYOUT;