應用程式的資料庫從Sql Server遷移到Oracle
原文地址: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 將應用程式從Sql Server遷移到OracleSQLServerOracle
- 用 Oracle sql*loader 把公司的資料庫從 sql server 遷移到 Oracle 9i 中OracleSQL資料庫Server
- 微軟雲端資料庫SQL Azure遷移到本地SQL Server的方法微軟資料庫SQLServer
- SQL Server資料庫從高版本遷移到低版本的解決方案SQLServer資料庫
- 將pentaho資料庫遷移到oracle資料庫資料庫Oracle
- 異構資料庫系統遷移到Oracle 工具 - Oracle SQL Developer資料庫OracleSQLDeveloper
- 從Sql Server遷移資料到OracleSQLServerOracle
- 將OPEN BRAVO資料庫從oracle 遷移到DB2資料庫OracleDB2
- SQL Server資料庫遷移SQLServer資料庫
- 從關聯式資料庫遷移到CouchDB資料庫
- 將SAP 後臺資料庫從DB2 遷移到ORACLE資料庫DB2Oracle
- 從關聯式資料庫遷移到NoSQL雲資料庫資料庫SQL
- 資料庫遷移到ASM資料庫ASM
- 從 SQL Server 到 MySQL (一):異構資料庫遷移ServerMySql資料庫
- 資料庫從檔案系統遷移到ASM資料庫ASM
- 將OPEN BRAVO後臺資料庫從ORACLE遷移到DB2資料庫OracleDB2
- 一次SQL Server遷移到Oracle的實施步驟SQLServerOracle
- MySQL資料庫遷移到PostgresMySql資料庫
- 將資料庫從ASM遷移到檔案系統資料庫ASM
- 將資料庫從檔案系統遷移到ASM資料庫ASM
- 將 Server Community Edition 應用程式方便地遷移到 WebSphere Application ServerServerUnityWebAPP
- 10種可以遷移到雲的應用程式
- Django應用資料庫從MySQL到PostgreSql的遷移Django資料庫MySql
- 將EJB 3應用程式遷移到GlassFish
- 將ORACLE資料庫資料檔案遷移到其他目錄(ZT)Oracle資料庫
- 資料庫搬移表空間(從chicago server搬移到wilson server)資料庫GoServer
- 將表 從mysql 遷移到oracleMySqlOracle
- 微軟釋出工具幫助使用者從SQL Server快速遷移到SQL Azure微軟SQLServer
- 用SQL Server 資料庫應該如何寫 ?? 謝謝!SQLServer資料庫
- 利用RMAN將資料庫從檔案系統遷移到ASM資料庫ASM
- Oracle資料庫遷移到國產資料庫核心難點解析 | 聯盟釋出Oracle資料庫
- 透過MySQL Workbench 將 SQL Server 遷移到GreatSQLMySqlServer
- AIX 資料庫遷移到z/linuxAI資料庫Linux
- 解除sql server資料庫佔用SQLServer資料庫
- Oracle 資料遷移(從Oracle11G高版本遷移到Oracle10G低版本)Oracle
- 你的資料庫真的需要遷移到雲嗎?資料庫
- 單例項資料庫expdp遷移到RAC庫單例資料庫
- ORACLE資料庫裡表匯入SQL Server資料庫Oracle資料庫SQLServer