需求:定时将上月的数据导入到oracle中,并更新指定的列。
原理:利用oracle中的sqlldr和Linux的定时任务crontab实现
步骤:
1. 文件命名约定。
由于要实现自动的导入,文件的命名要有一定的规则。要导入的数据文件名为filename+year+month 如: filename201401.txt
2. 数据文件内容
180000122 2014-1-4 16:05:53 180000123 2014-1-4 18:53:20 |
3. 编写sqlldr的控制文件
load data infile test_tab201312.txt append into table TEST_TAB fields terminated by X'09' TRAILING NULLCOLS (CALLNUM,STARTEDAT) |
4. 编写脚本实现数据的导入
#!/bin/bash
# 获取上两个月的年份和月份格式如:201312 v_oldfile_name=`date -d '-2 month' +%Y%m`
# 获取上一个月的年份和月份格式如:201401 v_file_name=`date -d '-1 month' +%Y%m`
# 替换sqlldr控制文件中要导入的文件名 sed -i "s/$v_oldfile_name/$v_file_name/" test_tab.ctl
# 用sqlldr导入数据,并更新 sqlplus scoot/tiger <<EOF
select count(1) from test_tab;
! sqlldr scott/tiger control=test_tab.ctl errors=1 rows=1000 readsize=33554432 bindsize=33554432
update test_tab set sdate= trunc(startedat) where sdate is null ;
commit; analyze table test_tab compute statistics; select sysdate from dual; exit; EOF |
5. 将以上脚本保存,并加入到crontab中即可。