将公司系统从SqlServer 2K移植到Oracle 10g中的简要总结



时间: 2009-01-15 08:34 来源: 博客园 



 



    公司有一个系统是基于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

我们在做数据库移植设计的时候,完全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中没有出现问题。