如何从SQL Server迁移大批量数据到Oracle

2024-11-22 07:27:25
推荐回答(2个)
回答(1):

下面要说的是如果将txt文本数据导入到Oracle中
Dos 环境下使用SQl*Loader命令 加载
使用其它数据库的数据转移工具
Oracle 企业管理器中的数据加载功能
具体的技术实现
一、Dos 环境下加载
1、首先,服务器端的侦听服务必须已经开启。
测试方法:Dos 下输入
C:/>sqlplus username/password@serviceName
2、然后使用 Oracle 的 sqlldr 命令进行数据的导入
前期条件
1) Oracle 数据库端必须已经建好了需要导入的数据表的结构
2) 一个数据源文件 下面例子中为制表符分隔的文本文件 model.txt ,为Excel 表中导出的
3) 手工编辑一个XXX.CTL 的控制文件
4) 命令行加载数据

如下实例:
以下文件缺省放到C:/ 下,如果不是,就需要指明全路径
1. 命令控制文件 input.ctl 内容
命令
说明
load data
1、控制文件标识
infile 'model.txt'
2、要输入的数据文件名为test.txt
append into table system.塔位属性表
3、向表test中追加记录
fields terminated by X'09'
4、指定分隔符,字段终止于X'09',是一个制表符(TAB)
(编号,名称,大小)
5、定义列对应表中顺序

控制文件中指定插入数据的方式关键字
insert,为缺省方式,在数据装载开始时要求表为空
append,在表中追加新记录
replace,删除旧记录,替换成新装载的记录
truncate,同上
在 Dos 窗口下使用 SQl*Loader 命令实现数据的导入
C:/>sqlldr userid=system/manager@ serviceName control=input.ctl
默认日志文件名为:input.log
默认坏记录文件为:input.bad
二、使用其它数据库转移工具

以下以SQL Server 导入导出向导为例
1、在数据的导入导出向导中设置数据源服务器,实例中选择数据源选择SQL Server
2、然后指定要导入的Oracle 数据源
3、需要配置Oracle 的属性信息
需要注意的是,登录数据库的用户信息即为数据导入之后的方案名,即导入之后的SQL Server 中的表在Oracle 中标志名为 username.表名
以下按照提示即可,可以完全导入SQl Server 中的数据表和视图,也可以使用查询语句返回你要选择的列或者行。
三、Oracle 企业管理器中的数据加载功能
登录Oracle 的控制台界面,针对单独的数据表可以使用数据加载工具
中间需要指定控制文件等,同Dos 加载一致,不再重复

----------------------------------------------------
向Oracle中导入文本数据时使用的控制文件格式

无论是使用上一篇中的哪种方式都需要有一个控制文件,下面是控制文件(ctl文件)书写的基本格式:

命令
说明

load data
1、控制文件标识

infile 'testl.txt' 
2、要输入的数据文件名为test.txt,此时是要导入的数据文件同控制文件在同一路径下,如果不在同一路径下则需要写完整路径名

append into table 表名(可以是全名也可以是同义词)
3、向表test中追加记录

fields terminated by X'09'
4、指定分隔符,字段终止于X'09',是一个制表符(TAB),如果用逗号分割就将X'09'替换为','

(编号,名称,大小)
5、定义列对应表中顺序

控制文件中指定插入数据的方式关键字

insert,为缺省方式,在数据装载开始时要求表为空
append,在表中追加新记录
replace,删除旧记录,替换成新装载的记录
truncate,同上
控制文件的示例:
load data
infile 'test.txt'
append into table test.test
fields terminated by X'09'
(test,test1,test2)
对有时间类型的数据导入的示例控制文件:
load data
infile 'h:/TB_FACT_PHS_TICKET_DAY.txt'
Append into TABLE TB_FACT_PHS_TICKET_DAY
fields terminated by X'09'
(Time_Id
,Region_Id
,Cust_Type_Id
,Prod_Type_Id
,Acct_Item_Type_Id
,Acct_Item_Type_Cd
,Exchange97_Cd
,Latn_Cd
,Call_Duration
,Access_In_Duration
,Income
,In_Date Date "YYYY-MM-DD"
)
文件导入命令 C:/>sqlldr userid=test/test@test control=test.ctl(此时控制文件test.ctl存在C:/路径下)
在命令控制符下进入Oracle C:/>sqlplus username/password@serviceName

oracle导入txt数据文件2008年07月30日 星期三 17:21把txt文件格式的数据文件导入oracle的方法是利用sqlloader工具。
第一步:把文本格式的数据文件放入C盘。如,test.txt
第二步:建立控制文件append.ctl。(名字可以随便取,放C盘下)
append.ctl的内容如下:
  load data           --1、控制文件标识
 infile 'test.txt'       --2、要输入的数据文件名为test.txt
 append into table CTXSYS.test   --3、向CTXSYS表空间中的表test中追加记录
 fields terminated by X'09' --4、字段终止于X'09',是一个制表符
(id,username,password,sj)   -----定义列对应顺序
其中append为数据装载方式,还有其他选项:
a、insert,为缺省方式,在数据装载开始时要求表为空
b、append,在表中追加新记录
c、replace,删除旧记录,替换成新装载的记录
d、truncate,同上
第三步:在命令提示符下输入命令。
C:/>sqlldr userid=username/password
control=c:/append.ctl 数据库中用名的用户名和密码
或者 C:/>sqlldr userid=system/manager@ serviceName control=input.ctl
第二条命令中的system数据库用户名
manager密码
@serviceName 是Oracle中本地配置文件的服务名

----------------------------------------------------

一些经常出现的问题:

1。关于日期格式的问题:

ctl基本写法诸如:

load data
infile 'C:/TP_LOANCONTRACTSUM.txt'
insert into table TP_LOANCONTRACTSUM
fields terminated by '|!'
(
column01,
column02,
column03,
column04 "to_date(:column04,'''yyyy-mm-dd hh24:mi:ss''')",
column05 "to_date(:column05,'''yyyy-mm-dd hh24:mi:ss''')",
column06,
column07,
column08,
column09,
column10,
column11,
column12 "to_date(:column12,'''yyyy-mm-dd hh24:mi:ss''')",
column13
)

2。关于长字符串问题,CTL默认情况下是256位(或者256位左右),所以长字符串时会在log里报错,提示所输入的值超过最大长度,解决办法,在ctl文件里再指定大小,注意个情况,不能写VARCHAR只能写CHAR,否则报错,诸如:

load data
infile 'C:/TP_PLEDGECONTRACTINFO.txt'
insert into table TP_PLEDGECONTRACTINFO
fields terminated by '|!'
(
column01,
column02,
column03,
column04,
column05,
column06,
column07 "to_date(:column07,'''yyyy-mm-dd hh24:mi:ss''')",
column08,
column09,
column10 "to_date(:column10,'''yyyy-mm-dd hh24:mi:ss''')",
column11,
column12,
column13,
column14,
column15 "to_date(:column15,'''yyyy-mm-dd hh24:mi:ss''')",
column16,
column17,
column18 "to_date(:column18,'''yyyy-mm-dd hh24:mi:ss''')",
column19,
column20,
column21,
column22,
column23,
column24,
column25 "to_date(:column25,'''yyyy-mm-dd hh24:mi:ss''')",
column26 CHAR(500),
column27,
column28
)

回答(2):

现在以一个实例来详细说明使用,在实例中讲解controlfile注意事项:
以客服系统中的话单表:tbilllog1为例
create table tbilllog1(
callid char(25),
callidnum numer(5),
callerno varchar(26),
calleeno varchar(26),
waitbegin datetime,
waitend datetime,
ackbegin datetime,
ackend datetime ,
...
)
第一步:从SQLSERVER中导出数据
在SQLSERVER数据库上使用Import and Export Data工具
1.在choose a Data source页
选取:
source= Microsoft OLE DB Porvider for Sql Server
server=local
database=icd_db_bill
{use Sql Server authentication}
user=sa
选择下一步
2.在choose destination 页中
选取destination为Text File
file name ="d:\backup\tbilllog1.txt"
选择下一步
3. 选择use a query to specify the data to transfer
选择下一步
注:由于SQLSERVER导出时会将table_id作为一个域导出,而oracle没有(oracle 为rowid),所以必须选择此项为use a query to specify the data to transfer而不是copy table(s) from source database
4.在Query Builder选项进入
选取tbilllog1,添加然后将table_id从列表中去掉
一直确认直到select Destination File Format页面
5.选择
file type =ansi (缺省)
row={cr}{lf} (缺省)
column=comma (缺省)
text= double quote{"} (缺省)
在comumn和text选项会影响到oracle的controlfile的设置

第二步:
oracle方面的设置
首先将tbilllog1.txt 拷贝到log1.ctl的目录
提示:如果NT平台可以先压缩再传送可以节省时间,到目的目录再解开
controlfile example: log1.ctl
LOAD DATA
INITFILE 'tbilllog1.txt'
insert into table tbilllog1
fields terminated by ',' optionally enclosed by '"'
(
callid,
callidnum,
callerno,
calleeno,
waitbegin date "yyyy--mm-dd hh24:mi:ss",
waitend date "yyyy-mm-dd hh24:mi:ss",
ackbegin date "yyyy-mm-dd hh24:mi:ss",
ackend date "yyyy-mm-dd hh24:mi:ss",
...
)
*fields terminated by ','指明域由,分割,对应到上面第5步的column=comma
*optionally enclose by '"'指明字符型数据有" "括起来,对应到text=double quote{"}如果选择text=none 不加此语句。
上例子中可以看见char,number型数据无需在log1.ctl中专门设置,而对于date型需要针对进行设置:
RECORD example1:
" 980956750 331 7 0 ",-1,"5579030","170",2001-01-31 23:59:10,2001-01-31 23:59:10,....
Record example2:
980956750 331 7 0,-1,5579030,170,2001013,20010131,....
在例一中字符串由 "标志,所以需要加optionally enclosed by '"',在例二中不需
在例一中日期格式需要在域名后加 'date "yyyy-mm-dd hh24:mi:ss",

LOAD DATA
INITFILE 'tbilllog1.txt'
insert into table tbilllog1
fields terminated by ',' optionally enclosed by '"'
(
callid,
callidnum,
callerno,
calleeno,
waitbegin date "yyyy--mm-dd hh24:mi:ss",
waitend date "yyyy-mm-dd hh24:mi:ss",
ackbegin date "yyyy-mm-dd hh24:mi:ss",
ackend date "yyyy-mm-dd hh24:mi:ss",
...
)
在例二中日期格式需要在域名后加' date "yyyymmdd" '
即LOAD DATA
INITFILE 'tbilllog1.txt'
insert into table tbilllog1
fields terminated by ',' optionally enclosed by '"'
(
callid,
callidnum,
callerno,
calleeno,
waitbegin date "yyyymmdd",
waitend date "yyyymmdd",
ackbegin date "yyyymmdd",
ackend date "yyyymmdd",
...