浏览 6038 次
锁定老帖子 主题:定时加载文件到数据库tips
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-22
如果需要每日装载特定目录里面的所有文件,因为文件名不确定,所以得用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调度的方式就乱码了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-28
是问题就会爆发..
本来$load_date只是一个监控的参数,现在需要把这个变量导入的数据库中,但是写在ctl文件里面识别不了,不知道有什么办法没? 难道只有在sqlldr完再加上一句 update .. set load_date = $load_date where load_date is null 吗? |
|
返回顶楼 | |
发表时间:2007-05-29
采用sysdate,或者其他例如trigger来做可以么?
|
|
返回顶楼 | |