應用程式的資料庫從Sql Server遷移到Oracle

君落塵發表於2014-11-13

原文地址:http://hi.baidu.com/dashuaiwang/blog/item/dde661f4fd915ccaf3d38527.html

遷移案例一:資料庫: Sql Server 2008到Oracle 9i

工具: Sybase PowerDesiner 12 試用版, PL/SQL Developer 7.1.5

遷移主要有兩個工作:

  1. 根據Sql Server資料庫生成建立Oracle資料庫的指令碼

  2. 修改程式碼中的SQL語句

根據Sql Server資料庫生成建立Oracle資料庫的指令碼

  1. 用PowerDesiner將Sql Server資料庫反向工程生成物理資料模型

  2. 根據反向工程生成的物理資料模型建立邏輯模型

  3. 再根據邏輯模型生成Oracle資料庫版本的物理模型

  4. 根據Oracle資料庫版本的物理模型生成Oracle資料庫建立指令碼

  5. 按照Oracle命名規則和資料型別定義修改Oracle資料庫建立指令碼

  6. 在PL/SQL Developer中執行以檢驗其正確性

修改程式碼中的SQL語句

  1. Sql Server中經常用方括號把表名和欄位名括起來, 到Oracle中要把這些方括號都去掉

  2. 將引數變更前的"@"符號改為":"符號

  3. 將Sql Server專有的方法和函式替換成Oracle相應的方法和函式

  4. 在PL/SQL Developer中執行SQL語句以檢驗其正確性

轉換過程中的常見問題

  1. 表名和欄位名使用了Oracle中的關鍵字

  2. Sql Server中的NVARCHAR資料型別可存4000個漢字, Oracle中的NVARCHAR/NVARCHAR2資料型別只能存2000個漢字

  3. 索引名稱和外來鍵名稱超過了30個字元

  4. PowerDesigner生成的指令碼, 表名和欄位名都加了引號, 要去掉

案例二:資料庫SqlServer 2K到Oracle 10g

公司有一個系統是基於SqlServer 2k,現在,應客戶要求,移植到Oracle 10g資料庫。程式碼的擴充套件極其easy,三下五除二,搞定。就是在將資料從SqlServer 2k匯入到Oracle 10g資料庫中時出現了一些問題。剛開始採用的方案是把表結構和資料匯入到Sql指令碼中,然後在Oracle資料庫中執行Sql指令碼。這個過程涉及到資料庫欄位型別的轉換問題,容易出錯。後來採用使用SqlServer 2k的DTS 將資料從SqlServer中匯入到Oracle 10g中。工作就這麼搞定了,為了方便以後資料型別的轉換,方便以後做針對不同資料庫的Sql指令碼,我把SqlServer 2k和Oracle 10g大部分資料型別都做了一下測試,當然現在只有SqlServer 2k和Oracle 10g資料對應關係。不對應關係如下:

SqlServer 2k轉換為Oracle 10g

 


列名 SqlServer資料型別 SqlServer長度 Oracle資料型別
column1 bigint 8     NUMBER(19)
column2 binary 50     RAW(50)
column3 bit 1     NUMBER(2)
column4 char 10     CHAR(10)
column5 datetime 8     DATE
column6 decimal 9     NUMBER(18)
column7 float 8  BINARY_DOUBLE
column8 image 16     BLOB
column9 int 4     NUMBER(10)
column10 money 8   NUMBER(19,4)
column11 nchar 10   NCHAR(10)
column12 ntext 16   NCLOB
column13 numeric 9  NUMBER(18)
column14 nvarchar 50  NVARCHAR2(50)
column15 real 4  BINARY_FLOAT
column16 smalldatetime 4  DATE
column17 smallint 2  NUMBER(5)
column18 smallmoney 4  NUMBER(10,4)
column19 sql_variant  BLOB
column20 text 16  CLOB
column21 timestamp 8  RAW(8)
column22 tinyint 1  NUMBER(3)
column23 uniqueidentifier 16  BLOB
column24 varbinary 50  RAW(50)
column25 varchar 50  VARCHAR2(50)


 


Oracle 10g 轉換為SqlServer 2k

 


Oracle列名 Oracle資料型別 SqlServer列名 SqlServer資料型別 SqlServer資料長度
COLUMN1 BINARY_DOUBLE COLUMN1 float 8
COLUMN2 BINARY_FLOAT COLUMN2 real 4
COLUMN3 BLOB COLUMN3 image 16
COLUMN4 CLOB COLUMN4 ntext 16
COLUMN5 CHAR(10) COLUMN5 nchar 10
COLUMN6 DATE COLUMN6 datetime 8
COLUMN12 NUMBER COLUMN12 numeric 13
COLUMN13 NVARCHAR2(10) COLUMN13 nvarchar 10
COLUMN14 RAW(10) COLUMN14 varbinary 10
COLUMN15 TIMESTAMP(6) COLUMN15 datetime 8
COLUMN16 TIMESTAMP(6) WITH LOCAL TIME ZONE COLUMN16 datetime 8
COLUMN17 TIMESTAMP(6) WITH TIME ZONE COLUMN17 datetime 8
COLUMN18 VARCHAR2(10) COLUMN18 nvarchar 10
COLUMN7 INTERVAL DAY(2) TO SECOND(6) COLUMN7 nvarchar 30
COLUMN8 INTERVAL YEAR(2) TO MONTH COLUMN8 nvarchar 14
COLUMN9 LONG COLUMN9 ntext 16
COLUMN10 LONG RAW COLUMN10 image 16
COLUMN11 NCLOB COLUMN11 ntext 16


 

     我們在做資料庫移植設計的時候,完全DIY,可以考慮設計可擴充套件元件完成這種資料庫表、列等對應關係的轉換工作,那麼以後再做系統移植中資料匯入時就一勞永逸了。現在也沒有時間做這種工作,不過感覺這還是挺有意義的一項工作。

    在轉換過程中,出現了另一個問題,就是如果SqlServer 2k 中的表名含有小寫,那麼在匯入到Oracle 10g後,需要修改表名,否則Sql語句會執行失敗。(匯入後表名多了引號) 比如SqlServer 2k有一個表test,匯入到Oracle 10g後顯示的表名仍然為test,但是如果你要查詢test表中的資料時,按照正常情況下,你只用輸入select * from test即可,可是現在卻變成select * from "test"。透過Oracle 10g的維護系統進入修改表名時,表名顯示為帶有引號的-"test"。出現這個問題,因為表不是很多,所以我們將SqlServer 2k的表名都改為了大寫,或者在Oracle中將表名改為大寫,就ok了,需要注意這些細節。Oracle 10g匯入到SqlServer 2k中沒有出現問題。


附註:oracle的命名規則
oracle中的各種資料物件,包括表名稱,檢視,等等名稱的命名都需要遵循oracle的命名規則。oracle的命名規則分為標準命名方式和非標準命名方式。

   標準命名方式需要滿足以下的條件:

   以字元打頭
   30個字元以內
   只能包含A-Z,a-z,0-9,_,$,and,$和#
   不能和同一個使用者下的其他物件重名
   不能是oracle伺服器的保留字

   例如:下面的SQL語句是錯誤的:create tabel emp-bonus( empid number(10),bonus number(10));因為表名使用了“-”,這在標準命名中是不允許的。

   還有一類是非標準命名。這時候你可以使用你想使用的任何字元,包括中文,oracle中的保留字,空格等等都是可以的,但是需要將物件名用雙引號引起來。例如: create table “table” (test1 varchar2(10));將會建立一個表名為table的表。並沒有什麼語法錯誤。但這這樣以後就需要以後在使用這個物件時必須用雙引號經物件引起來,例如對於剛才建立的表使用select * from table;是不行的,只能使用select * from “table”;

參考引用:

Oracle 資料型別

  

Oracle 釋出伺服器的資料型別對映

     

SQL Server,Oracle資料型別轉換 
     http://hi.baidu.com/luodaijun/blog/item/c6a3b41b97a61f198718bfce.html

Oracle,sql server的空值(null)判斷 

    http://hi.baidu.com/luodaijun/blog/item/3c4cfb037b433e88d43f7cdd.html

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

相關文章