首页 > Linux操作系统 > Linux操作系统 > sql loader初探
由于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/ ,如需转载,请注明出处,否则将追究法律责任。