将公司系统从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 |
我们在做数据库移植设计的时候,完全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中没有出现问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。