ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sql loader初探

sql loader初探

原创 Linux操作系统 作者:susan_huangyong 时间:2010-05-05 13:47:30 0 删除 编辑

由于QAD的不开放性,尝试过各种接口,如: 文本导出、JDBC连接、ODBC连接,结果发现各有利弊。

文本导出优点就是快,文件可进行查错用,但实时性不强,其它数据库无法调用,只能由QAD执行JOB导出。

JDBC连接优点是实时性强,无需QAD干预,但需要有LICENSE限制,由于QAD的LICENSE有限,经常JDBC连接错误无法取得数据,速度也不快。

ODBC连接优点也可以实时,直接由程序调用,但也受LICENSE限制,速度较慢。

另一系统已经设计为JDBC连接QAD抓取数据了,又由于JDBC经常错误导致数据取不到而影响业务,无奈准备采用文本导出的方式,起码保证有数据可用啊。文本导出不是难事,sqlloader从示接触,查看了一堆介绍它的资料,准备开工。

文本导出形如以下:


                                              Buy
Site     Item Number        Order    Supplier Pln      Supplier qad_datefld[1] qad_decfld[1]
-------- ------------------ -------- -------- -------- -------- -------------- -------------
dddd-b   1012N-001          0260401B 91FG026  DF570    XG       31/12/03              100.00
cccc-b   1012N-010          0260401B 91FG026  DF570    XG       18/03/04              100.00
eeee-b   1012Q01-001        0260401B 91FG026  DF570    91FG026  31/12/03              100.00
ffff-B   1012Q01-010        0260401B 91FG026  DF570    XG       18/03/04              100.00
gggg-b   1117N-001          0260401B 91FG026  DF570    91FG026  31/12/03              100.00
fffff-B   1117N-010          0260401B 91FG026  DF570    XG       18/03/04              100.00
axxxx-b   1125N-001          0260401B 91FG026  DF570    91FG026  31/12/03              100.00

 

控制文件如以下:

load data           
infile 'jis.txt'      
append into table tmp_qad   
fields terminated by X'09'  
(facility,part_nbr,po_nbr,po_vend,CHARGE,vend_pl,eff_date,qad_rate)

注意:列的顺序必须与文本的顺序保持一致,列名必须与表中的字段名保持一致。

sqlloader语句如下:

sqlldr user/pass control=con.ctl log=jis.log

执行后一堆错误,就是找不到列啦之类的。

奇怪,列和顺序都能对上,怎么会出错呢。也查不到相关文本数据规范的介绍,寻思可能有列头系统不认得,结果把列头去掉了,再执行,错误仍旧。只能是格式问题了,怀疑文本列之间的间隔并不是我想的TAB,试着用EXCEL打开文本就真相大白了,分隔符选择TAB是无法区分列的,用空格倒是可以,因此将控制文件更改如下:

load data           
infile 'jis.txt'      
append into table tmp_qad   
fields terminated by whitespace
(facility,part_nbr,po_nbr,po_vend,CHARGE,vend_pl,eff_date,qad_rate)

再执行,成功,1000多条记录3秒不到就成功了,速度非常满意。

表头在QAD导出时屏蔽不了,只能在导入时过滤,查看资料可以SKIP掉,如:

sqlldr usr/pass control=con.ctl log=jis.log skip=4

执行仍然同错,查看LOG文件发现如果列为空则校验失败,不明白为什么去掉列头时也有为空的列也能成功导入,再也查询不到任何有用资料,只好在导出时将所有为空的都赋上默认值,再执行,成功!

写日志以增强记忆。

回头又测试,将SKIP改在控制文件里,如下:

OPTIONS (skip=4)
load data           
infile 'jis.txt'      
append into table tmp_qad   
fields terminated by whitespace
(facility,part_nbr,po_nbr,po_vend,CHARGE,vend_pl,eff_date,qad_rate)

效果和SKIP放在sqlldr里是一样的。

由于此表是每天定时抓取,插入之前是要清空的,因此使用append关键字只会数据插入越来越多,而且重复。因此需要在插入之前先清空表。

查阅资料后表明,append实际上只insert,而replace是先delete然后insert,truncate是truncate后再insert,即使用后两个关键字都符合要求。因此,控制文件更改如下:

OPTIONS (skip=4)
load data           
infile 'jis.txt'      
replace into table tmp_qad   
fields terminated by whitespace
(facility,part_nbr,po_nbr,po_vend,CHARGE,vend_pl,eff_date,qad_rate)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/352988/viewspace-661967/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-16

  • 博文量
    35
  • 访问量
    106256