使用iloader生成fmt文件,用sed处理后生成ctl文件,用sqlldr导入到oracle中
- #!/bin/bash
- #"TB_BIL_ACCT_BALANCE_bak" "RATABLE_HISTORY_bak"
- TABLE_ARRAY=( "tb_bil_rent_arrear" ) #到导入的表的表名
- ALTIBASE_CONN="-s 127.0.0.1 -u test -p test"
- ORACLE_CONN="test/test"
- INPUT_TYPE=1 #2 REPLACE ;other APPEND
- TIME=`date +"%m%d%H%M%S"`
- case ${INPUT_TYPE} in
- 1)
- INPUT_TYPE_STR="APPEND"
- ;;
- 2)
- INPUT_TYPE_STR="REPLACE"
- ;;
- *)
- INPUT_TYPE_STR="APPEND"
- ;;
- esac
- echo 4
- for NUM in ${!TABLE_ARRAY[@]}
- do
- TABLE_NAME=${TABLE_ARRAY[NUM]}
- iloader formout ${ALTIBASE_CONN} -T ${TABLE_NAME} -f data.fmt >/dev/null
- if [ $? -gt 0 ] ; then
- echo "iloader formout error!"
- exit
- fi
- iloader out ${ALTIBASE_CONN} -f data.fmt -d data.dat >/dev/null
- if [ $? -gt 0 ] ; then
- echo "iloader out error!"
- exit
- fi
- echo "LOAD DATA" > data.ctl
- echo "INTO TABLE ${TABLE_NAME}" >> data.ctl
- echo "${INPUT_TYPE_STR}" >> data.ctl
- echo "FIELDS TERMINATED BY X'5E'" >> data.ctl
- echo 'TRAILING NULLCOLS' >> data.ctl
- echo "(" >> data.ctl
- sed -n '/{/,/}/{p;}' data.fmt | tail +2 | sed '$d;'|sed 's/bigint/integer/;s/numeric/integer/;s/integer[^;]*/integer external/;s/varchar/char/;s/date/date "YYYY\/MM\/DD HH24:MI:SS"/;s/;/,/;$s/,//;' >> data.ctl
- echo ")" >> data.ctl
- sqlldr userid=${ORACLE_CONN} control=data.ctl "log=${TABLE_NAME}_${TIME}.log" "bad=${TABLE_NAME}_${TIME}.bad" data=data.dat >/dev/null
- if [ $? -gt 0 ] ; then
- echo "sqlldr error!"
- exit
- fi
- done
- echo "load over!"
|