定时加载文件到数据库tips

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

如果需要每日装载特定目录里面的所有文件,因为文件名不确定,所以得用shell来获得文件名然后传给sqlldr 的data属性。代码如下:
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

即使用了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调度的方式就乱码了。

你可能感兴趣的:(Oracle,编程)