您的位置:首页 > 数据库 > Oracle

关于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文件运行这个交换了。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: