关于sqlserver和ORACLE之间数据交换的问题
2012-02-22 15:41
309 查看
数据交换是很多应用中遇到的问题,也是一个不好解决的问题。用数据库本身的机制进行数据交换无非就是那几个方法(sql :bcp,isql,dts Oracle:sqlldr,sqlplus等)通过个人的摸索以及上网求助,找到了一个可行的解决办法。以SQL SERVER2008上传数据至ORACLE 10g为例进行说明:
大致过程是 先从sql数据库中通过bcp命令导出需要进行交换的数据,然后通过Oracle的sqlldr命令将sql导出的数据进行导入,具体步骤如下:
从sql server中导出数据 【A:sql数据库 AT:SQL数据库表 B:oracle数据库 BT:oracle数据库表】
bcp "SELECT * FROM A..AT" queryout AT.csv -c -S 【数据库连接地址】 -U 【数据库用户名】 -P 【数据库密码】
通过此命令可以将SQL数据库中需要交换的数据导出成文本,导出文本数据列之间默认是以tab分割,当然也可以用这种方式,增加列分割符、行分隔符以及其他的东西,至于具体参数可以到网上搜哈啦。。
bcp "select * from A..AT" queryout AT.csv -c -t "<<<>>>" -r "<$$>" -S 【数据库连接地址】 -U 【数据库用户名】 -P 【数据库密码】 -t是列分割符,-r是行分割符,注意中间的空格,不要随意删除或者增加
此处查询出的交换数据最好和要交换的ORACLE数据表字段相对应,方便下面的操作
oracle导入
sqlldr userid=【数据库用户名】/【数据库密码】@【数据库连接地址】/【数据库实例】 control='B.ctl' log=B.txt rows=100160 readsize=20971520 bindsize=20971520 PARALLEL=TRUE
仔细看上面导入的脚本,发现它关联了一个ctl控制文件,也就是说它导入的哪个文件以及导入到哪个表中,字段如何对应就在这个控制文件中了。
控制文件
LOAD DATA
CHARACTERSET ZHS16GBK //此处定义了文件的编码方式,如果导入报错发现截取数据列很乱时应该就是编码方式错了
INFILE "B.csv" "str '<$$>'" //此处定义了从哪个文件读取要导入的数据,str后定义的是行分隔符,还有很多其他的参数,此处不再列出
truncate INTO B //导入到Oracle数据库的名称
Fields terminated by '<<<>>>' //此处为列分隔符
trailing nullcols
(
COL1 integer external,
//定义了对应B中的字段的转换方式,因为sql和oracle字段类型不能通用,所以此处必须转换,列出了int型和date型的转换方式
COL2 char(50), //如果不指定长度,默认是255
COL3 Date "YYYY-MM-DD HH24:MI:SS" NULLIF(COL3='NULL')
)
以上配置正确后就可以做一个bat文件运行这个交换了。。。。。
大致过程是 先从sql数据库中通过bcp命令导出需要进行交换的数据,然后通过Oracle的sqlldr命令将sql导出的数据进行导入,具体步骤如下:
从sql server中导出数据 【A:sql数据库 AT:SQL数据库表 B:oracle数据库 BT:oracle数据库表】
bcp "SELECT * FROM A..AT" queryout AT.csv -c -S 【数据库连接地址】 -U 【数据库用户名】 -P 【数据库密码】
通过此命令可以将SQL数据库中需要交换的数据导出成文本,导出文本数据列之间默认是以tab分割,当然也可以用这种方式,增加列分割符、行分隔符以及其他的东西,至于具体参数可以到网上搜哈啦。。
bcp "select * from A..AT" queryout AT.csv -c -t "<<<>>>" -r "<$$>" -S 【数据库连接地址】 -U 【数据库用户名】 -P 【数据库密码】 -t是列分割符,-r是行分割符,注意中间的空格,不要随意删除或者增加
此处查询出的交换数据最好和要交换的ORACLE数据表字段相对应,方便下面的操作
oracle导入
sqlldr userid=【数据库用户名】/【数据库密码】@【数据库连接地址】/【数据库实例】 control='B.ctl' log=B.txt rows=100160 readsize=20971520 bindsize=20971520 PARALLEL=TRUE
仔细看上面导入的脚本,发现它关联了一个ctl控制文件,也就是说它导入的哪个文件以及导入到哪个表中,字段如何对应就在这个控制文件中了。
控制文件
LOAD DATA
CHARACTERSET ZHS16GBK //此处定义了文件的编码方式,如果导入报错发现截取数据列很乱时应该就是编码方式错了
INFILE "B.csv" "str '<$$>'" //此处定义了从哪个文件读取要导入的数据,str后定义的是行分隔符,还有很多其他的参数,此处不再列出
truncate INTO B //导入到Oracle数据库的名称
Fields terminated by '<<<>>>' //此处为列分隔符
trailing nullcols
(
COL1 integer external,
//定义了对应B中的字段的转换方式,因为sql和oracle字段类型不能通用,所以此处必须转换,列出了int型和date型的转换方式
COL2 char(50), //如果不指定长度,默认是255
COL3 Date "YYYY-MM-DD HH24:MI:SS" NULLIF(COL3='NULL')
)
以上配置正确后就可以做一个bat文件运行这个交换了。。。。。
相关文章推荐
- 关于 Oracle分页数据重复的问题
- 关于对sqlserver进行大量数据操作,连接池满的问题--转载
- sqlserver关于 数据损坏|修复 问题
- 关于oracle插入clob数据类型的问题
- 关于EXCEL数据导入到SQLServer中字段存在NULL的问题
- 关于oracle重复数据合并以及.前面加0问题的解决
- 关于EXCEL数据导入到SQLSERVER中字段存在NULL的问题
- 针对各主流数据mysql、sqlserver、oracle中文乱码问题。
- Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
- 关于C#数据类型之间转换的问题
- 关于sqlserver中的表嵌套查询数据错乱的问题
- ORACLE 和SQLSERVER 两表之间批量更新数据对比
- 关于用Oracle的dblink连接到sqlservervd 的问题
- 关于myBatis与SQLserver 配合使用,查询类型为Date的数据时,日期会减少两天的问题
- 关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
- 关于oracle修复控制文件与数据文件不一致的问题----
- 关于oracle死锁问题——ORA-01436: 用户数据中的 CONNECT BY 循环
- 关于oracle导入sqlserver存在的唯一索引问题
- Oracle关于统计每天数据的总和时出现无效数字问题