论坛首页 综合技术论坛

定时加载文件到数据库tips

浏览 6038 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-22  
装载文本文件,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调度的方式就乱码了。
   发表时间:2007-05-28  
是问题就会爆发..
本来$load_date只是一个监控的参数,现在需要把这个变量导入的数据库中,但是写在ctl文件里面识别不了,不知道有什么办法没?
难道只有在sqlldr完再加上一句 update .. set load_date = $load_date where load_date is null 吗?
0 请登录后投票
   发表时间:2007-05-29  
采用sysdate,或者其他例如trigger来做可以么?
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics