定时加载文件到数据库tips

装载文本文件,oracle sqlldr是个好用的工具。

如果需要每日装载特定目录里面的所有文件,因为文件名不确定,所以得用shell来获得文件名然后传给sqlldr 的data属性。代码如下:
[code]
for file in `ls $daily_dir`
do
echo $file
load_date=`expr substr $file 1 8`
echo $load_date
sqlldr userid=$load_user/$load_password data=$daily_dir/$file control=$load_dir/ctl/load_daily_custinfo.ctl log=$load_dir/log/load_dailycustinfo.log rows=1024 parallel=true&
wait
mv $daily_dir/$file $load_dir/data/daily_bak
done
[/code]
即使用了control文件也能在外面指定data的。
control文件里面编程性比较弱,在infile参数里面可以识别shell中的变量,但是在数据定义里面就无法识别了,比如字段 load_date 我想从$laod_date变量里面取值,写成 load_date "$load_date" 是无法识别的。但是写成特定值是可以的,如 load_date "20070522"

但是如果固定值是"00000000"的话,即使load_date字段是char(8),导入后也只剩下一个0,sqlldr把它当作数字处理掉了。所以必须写成 load_date constant "00000000"

如果使用crontab来做定时执行,环境变量是值得留意设置的。因为crontab默认的PATH只有/usr/bin:/bin。所以在调用sqlldr之前得把$ORACLE_HOME/bin加到PATH中。
但是这样还不够,没有ORACLE_BASE和ORACLE_HOME变量,sqlldr将报错说:
Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL

sqlldr导入中文数据可能碰到乱码,设置CHARACTERSET ZHS16GBK(数据库字符集)能解决这个问题。
怪异的是通过securecrt telnet到服务器上sqlldr运行即使不加characterset也不会乱码,但是用crontab调度的方式就乱码了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值