Sybase迁移Oracle字符集问题,Sybase数据库迁移数据到Oracle(未改进)

本文主要讲述如何将Sybase数据库的数据迁移至Oracle中,因为我对Sybase不熟悉,所有本文讲述的只是完成Sybase数据表中的数据迁移到Oracle的一个过程

一、Sybase以及Oracle数据库配置

1、连接Sybase数据库

1.1、首先安装Sybase数据库以及Sybase数据库的可视化工具DBArtisan8.6.1

1.2、到Sybase数据库安装路径中(我的安装路径是:C:\SAP)找到ini文件夹下的sql.ini配置文件

(我的路径位置是 C:\SAP\ini),这个文件的功能就是配置数据库的数据源(包含数据库的主机地址

,端口,以及服务器名称

[dev](服务器名)

master=TCP,192.168.44.22,4100(数据库主机地址192.168.44.22以及端口4100)

query=TCP,192.168.44.22,4100

1.3、使用DBArtisan连接Sybase数据库:Datasource->Register Datasource,在弹出的窗口中

1.3.1、选择Sybase Adaptive Serve,下一步

ec2394a6ce12d0989ebfff631adc7cf6.png 连接Sybase数据库

1.3.2、填入数据源的主机地址以及ip端口

805468dc25f55054d26ed33ee9152fb4.png

1.3.3、填入用户名以及密码,然后测试连接,如果连接通过,那就点击下一步

b46b3d0267bbd681349d54cd632ce250.png 标题

1.3.4、然后点击完成,配置数据源就成功了

1.4、上面的步骤完成后,可视化工具会显示刚才自己配的数据源,双击,填写用户名和密码,登录

8b978ffd61f197eaaba0eda310a05928.png

2、连接Oracle数据库(不作详述)

二、将Sybase数据库中的数据导出到txt文件中

2.1、在Sybase可视化工具DBArtisan打开sql编辑窗口,执行下列语句:

set nocount on

use emulator(数据库名)

go

select 'bcp emulator.dbo(所有者).' + name + ' out d:\temp\' + name + '.txt -Sdev(dev为数据库服务器名) -Ucontrol(control为用户名) -Pcontrol(control为密码) -t"!|"(表示每个字段数据用!|分隔) -r"\n" -c' from sysobjects where type='U'

go

这个语句的作用就是生成所有表的bcp导出命令,这个bcp命令就是用来导出表的数据到txt文件中

2.2、执行上面的语句后,会生成如下结果:

025a8c9fa9ae2a9a7a5d2188ac724c5e.png 导出数据到txt的bcp命令

上面的bcp命令的意思就是:将emulator这个数据库中的account、relation、banker等表中的数据导出到

d:\temp\XX.txt文件中

-S:表示数据库所在的服务器名,在上面的sql.ini文件有配置;

-U:表示数据库的用户名

-P:表示数据库用户密码

-t"!|":表示在导出数据的时候,每个字段都用!|分隔开

2.3、创建一个.bat文件,并将上面的bcp命令都复制到bat文件中,然后双击执行这个bat批命令,没有报错后,就

可以在d:\temp这个目录下导出数据了

5f3f5374b3ab7d5666ff229a001229fc.png 导出数据后生成的txt文件

三、将txt文件中的数据导入到Oracle中:

下面以导入relationt表为例:

3.1、打开Sybase可视化工具DBArtisan,选中relation表,然后点击Extract

214d83eb14c85034edb40810254cad9e.png 导出relation表结构

这个步骤的作用就是查看relation表结构:

68dc3def9aea7ab8076eaa1fc6792914.png relation表结构

3.2、Oracle建表

因为Sybase的数据类型datetime和Oracle的数据类型不一样,Oracle的类型是date,所以不能直接将txt直接

导入到Oracle中,首先需要在Oracle建立临时表,并且临时表所有的时间类型都用varchar表示:

Oracle临时表:

CREATE TABLE relation1

(

fundacc    char(30) NOT NULL,

mnytype    char(4)  NOT NULL,

banker     char(8)  NOT NULL,

bankacc    char(30) NOT NULL,

acctype    char(4)  NOT NULL,

openmode   char(2)  NOT NULL,

b_branch   char(8)  NOT NULL,

b_deptid   char(8)  NOT NULL,

userid     char(8)  NOT NULL,

status     char(2)  NOT NULL,

settime1    varchar(30) NOT NULL,(时间类型统一用varchar)

updatetime1 varchar(30) NOT NULL,

CONSTRAINT pk_relation1

PRIMARY KEY(fundacc,mnytype,banker,bankacc)

);

commit;

Oracle正式表:

CREATE TABLE relation

(

fundacc    char(30) NOT NULL,

mnytype    char(4)  NOT NULL,

banker     char(8)  NOT NULL,

bankacc    char(30) NOT NULL,

acctype    char(4)  NOT NULL,

openmode   char(2)  NOT NULL,

b_branch   char(8)  NOT NULL,

b_deptid   char(8)  NOT NULL,

userid     char(8)  NOT NULL,

status     char(2)  NOT NULL,

settime    date NOT NULL,

updatetime date NOT NULL,

CONSTRAINT pk_relation

PRIMARY KEY(fundacc,mnytype,banker,bankacc)

);

commit;

在Oracle执行上面建表语句

3.3、生成ctl脚本:

Oracle有一个叫sqlldr的工具,可以用来将txt数据导入到数据表中,建立一个后缀名为ctl的脚本,脚本命名

为relation.ctl。将以下内容写进脚本中:

load data

infile 'D:\temp\relation.txt'(Sybase导出的txt数据)

append into table relation1(表示将txt的数据导入到relationX1表中)

fields terminated by "!|" (读取txt数据时,以!|终止,每一个!|分隔的数据就表示一个字段的数据)

OPTIONALLY ENCLOSED BY '"'

trailing nullcols(表示允许字段数据为null)(下面对应relation表的字段名称)

(

fundacc,

mnytype,

banker,

bankacc "nvl(:bankacc,' ')",(读取txt文件时,如果该字段数据为null,那么给一个空格作为默认值,因为有些表设计的时候,字段不能为null,所以给一个空格)

acctype "nvl(:acctype,' ')",

openmode "nvl(:openmode,' ')",

b_branch "nvl(:b_branch,' ')",

b_deptid "nvl(:b_deptid,' ')",

userid "nvl(:userid,' ')",

status,

settime1,

updatetime1

)

3.4、编写sqlldr命令,并放到命令行执行:

sqlldr test/test@127.0.0.1:1521/goldpre control=D:\relation.ctl log=D:\SybaseToOracle_Log\relation.log

test/test@127.0.0.1:1521/goldpre 是Oracle数据源,127.0.0.1:1521是数据源主机地址以及端口,goldpre是

数据源服务器名

D:\relation.ctl表示ctl脚本的位置;

log=D:\SybaseToOracle_Log\relation.log:执行ctl后生成的日志文件

上面命令执行后,查看日志文件,没报错的话,就继续下面步骤

3.5、将临时表的数据转换迁移到正式表中

下面这条sql是将临时表relation1的数据复制插入到正式表relation中

insert into relation  select fundacc,mnytype,banker,bankacc,acctype,openmode,b_branch,b_deptid,userid,status,to_date(substr(settime1,1,length(settime1)-6)||substr(settime1,length(settime1)-1,2),'Mon DD YYYY HH:MI:SSPM','NLS_DATE_LANGUAGE = American') settime,to_date(substr(updatetime1,1,length(updatetime1)-6)||substr(updatetime1,length(updatetime1)-1,2),'Mon DD YYYY HH:MI:SSPM','NLS_DATE_LANGUAGE = American') updatetime from relation1

下面这段函数就是讲varchar类型的日期数据(Dec 14 2004  7:26:23:390PM)转换成date类型的数据

to_date(substr(settime1,1,length(settime1)-6)||substr(settime1,length(settime1)-1,2),'Mon DD YYYY HH:MI:SSPM','NLS_DATE_LANGUAGE = American') settime

删除临时表:

drop table relation1;

purge table relation1;

最后使用select * from relation,查看表中数据是否有问题,到此表数据由Sybase迁移到Oracle就完成了

四、结束语:

因为本人对Sybase不熟悉,所以以上工作仅限Sybase表中数据迁移,不设计存储过程等其他的,如有问题欢迎大家指点

改进。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值