自動ftp,生成control file,sql*load的shell指令碼
這是一個自動從各資料來源利用ftp獲取文字檔案,
利用本地各個資料來源目錄下已有的seed.ctl動態生成sql*loader controlfile,
然後用sql*loader將資料倒入資料庫,
並獲取summary information,send mail to users。
第一次寫了這麼長的shell,很有成就感 :D
(因為需要一些環境配置,該shell無法執行,但是裡面一些指令碼自己覺得還是很滿意,尤其是動態生成控制檔案部分,更詳細的資訊直接看指令碼吧)
[@more@]#/usr/bin/bashnad_env()
{
LOG_DATE=`date "+%Y%m%d"`
EMAIL_CONTENT=/tmp/CRL_MAIL.$LOG_DATE
export EMAIL_CONTENT
}
nad_ftp()
{
FILE_TYPE=$1
FTP_LOG_FILE=./log/ftp_${FILE_TYPE}_${LOG_DATE}.log
LPATH=./in/${FILE_TYPE}
if [ ${FILE_TYPE} == 'ORDER' ]; then
FILE_EXT="moto_oe_cell_SB${LOG_DATE}*.dat"
HOST=144.***.**.***
USERNAME=orders
PASSWORD=******
RPATH=.
else
FILE_EXT="*.ZIP"
HOST=....
USERNAME=
PASSWORD=
RPATH=
fi
echo "*****************************************" >> ${FTP_LOG_FILE}
echo "Begin ftp from $HOST " `date` >> ${FTP_LOG_FILE}
echo "*****************************************" >> ${FTP_LOG_FILE}
ftp -i -n>>/dev/null<
user $USERNAME $PASSWORD
cd $RPATH
lcd $LPATH
bin
mget ${FILE_EXT}
bye
EOF
cd ./in/${FILE_TYPE}
if [ -e *.ZIP ]; then
for FILE_NAME in `ls *.ZIP|cut -d "." -f 1`
do
unzip ${FILE_NAME}.ZIP
rm ${FILE_NAME}.ZIP
done
fi
if [ -e *.dat ]; then
for FILE_NAME in `ls *.dat|cut -d "." -f 1`
do
mv ${FILE_NAME}.dat ${FILE_NAME}.txt
done
fi
cd ../..
echo "**********************************" >> ${FTP_LOG_FILE}
echo "FTP FINISHED" `date`>> ${FTP_LOG_FILE}
echo "**********************************" >> ${FTP_LOG_FILE}
}
nad_ldr()
{
FILE_TYPE=$1
for FILE_NAME in `ls in/${FILE_TYPE}/*.txt|cut -d "." -f 1|cut -d "/" -f 3`
do
echo "FILE_NAME is : "$FILE_NAME
cp ./in/${FILE_TYPE}/seed.ctl ./in/${FILE_TYPE}/${FILE_NAME}.ctltmp
sed -e "s/seed/${FILE_NAME}/g" ./in/${FILE_TYPE}/${FILE_NAME}.ctltmp > ./in/${FILE_TYPE}/${FILE_NAME}.ctl
rm ./in/${FILE_TYPE}/${FILE_NAME}.ctltmp
done
echo "FILE_TYPE is: " ${FILE_TYPE}
case ${FILE_TYPE} in
DARTMAIL) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=1
;;
XPEDITE) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
EMAILRESP) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
MODEL) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
ORDER) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
PRODREG) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
PROMOREG) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
REBATE) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
UNSUB) sqlplus -s siebel/siebel>>/dev/null<
EOF
SKIP_NUM=0
;;
esac
for FILE_NAME in `ls in/${FILE_TYPE}/*.txt|cut -d "." -f 1|cut -d "/" -f 3`
{
sqlldr siebel/siebel control=./in/${FILE_TYPE}/${FILE_NAME}.ctl log=./log/${FILE_NAME}.log bad=./bad/${FILE_NAME}.bad errors=9000000 skip=${SKIP_NUM}
FLAT_FILE_NAME="./in/${FILE_TYPE}/${FILE_NAME}.txt"
LOG_FILE_NAME="./log/${FILE_NAME}.log"
if [ -e "./bad/${FILE_NAME}.bad" ]; then
BAD_FILE_NAME="./bad/${FILE_NAME}.bad"
BAD_RECDS=`cat ${BAD_FILE_NAME}|wc -l`
else
BAD_FILE_NAME="null"
BAD_RECDS=0
fi
START_DATE=`grep "Run began on" ${LOG_FILE_NAME}|awk '{print $5,$6,$7,$8}'`
END_DATE=`grep "Run ended on" ${LOG_FILE_NAME}|awk '{print $5,$6,$7,$8}'`
TOTAL_RECDS=`cat ${FLAT_FILE_NAME}|wc -l`
LOAD_RECDS=`cat ${LOG_FILE_NAME}|grep "Rows successfully loaded"|awk '{print $1}'`
if [ ${BAD_RECDS} -gt 5 ]; then
ACTION_OUTCOME="Loading failed"
else
ACTION_OUTCOME="Loading succeed"
fi
sqlplus -s siebel/siebel>/dev/null<
SET HEAD OFF
SET TERM OFF
insert into nad_eventlog
(
ACTION_NAME,
ACTION_START_DATE,
ACTION_FINISH_DATE,
ACTION_OUTCOME,
FLAT_FILE_NAME,
LOG_FILE_NAME,
BAD_FILE_NAME,
NBR_OF_TOTAL_RECORDS,
NUMBER_OF_RECORDS_LOADED,
NBR_OF_REJECTED_RECORDS
)
values(
'Data Loading--'||'${FILE_TYPE}',
to_date('${START_DATE}','Mon dd hh24:mi:ss yyyy'),
to_date('${END_DATE}','Mon dd hh24:mi:ss yyyy'),
'${ACTION_OUTCOME}',
'${FLAT_FILE_NAME}',
'${LOG_FILE_NAME}',
'${BAD_FILE_NAME}',
${TOTAL_RECDS},
${LOAD_RECDS},
${BAD_RECDS}
);
commit;
exit;
EOF
echo "" >> $EMAIL_CONTENT
echo "Load file: " ${FLAT_FILE_NAME} >> $EMAIL_CONTENT
echo "Began at: " ${START_DATE} >> $EMAIL_CONTENT
echo "Ended at: " ${END_DATE} >> $EMAIL_CONTENT
echo "Total records: " ${TOTAL_RECDS} >> $EMAIL_CONTENT
echo "Loaded records: " ${LOAD_RECDS} >> $EMAIL_CONTENT
echo "Rejected records: " ${BAD_RECDS} >> $EMAIL_CONTENT
echo "Log file: " ${LOG_FILE_NAME} >> $EMAIL_CONTENT
echo "Bad file: " ${BAD_FILE_NAME} >> $EMAIL_CONTENT
mv ./in/${FILE_TYPE}/${FILE_NAME}.txt ./inbak/${FILE_TYPE}/${FILE_NAME}.txt
mv ./in/${FILE_TYPE}/${FILE_NAME}.ctl ./inbak/${FILE_TYPE}/${FILE_NAME}.ctl
}
mail $EMAIL1 $EMAIL2<
Subject: NAD system data load log information for $FILE_TYPE
`cat $EMAIL_CONTENT`
EOF
rm $EMAIL_CONTENT
}
######################
# Main
######################
if [ $# -lt 1 ]; then
echo "Usage: ongoing SOURCE_TYPE"
exit 1
fi
FILE_TYPE=$1
nad_env
if [ ${FILE_TYPE} == 'ORDER' ]; then
nad_ftp $1
fi
nad_ldr $1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/207/viewspace-778461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server映象自動生成指令碼方法SQLServer指令碼
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- Shell指令碼實現生成SSL自簽署證書指令碼
- shell 備份檔案指令碼+自動清理指令碼
- awr報告每天自動生成指令碼指令碼
- 案例八:Shell自動化管理賬號指令碼指令碼
- 如何讓shell指令碼自殺指令碼
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- [shell]shell指令碼實現每天自動抽取資料插入hive表指令碼Hive
- java 自動升級sql指令碼 flyway 工具JavaSQL指令碼
- shell指令碼-免互動指令碼
- [20231023]生成bbed的執行指令碼(bash shell).txt指令碼
- 自動定時備份 mysql 資料庫 的 shell 指令碼MySql資料庫指令碼
- 用於自動監控磁碟使用情況的 Shell 指令碼指令碼
- 用bat指令碼自動生成安裝包InnosetupBAT指令碼
- flyway實現java 自動升級SQL指令碼JavaSQL指令碼
- linux透過shell指令碼實現ssh互動式自動化Linux指令碼
- shell指令碼編碼格式問題,bin/sh^M: bad interpreter: No such file or directory指令碼
- I/O上的等待事件 —— control file sequential read/control file parallel write事件Parallel
- shell指令碼指令碼
- 自動批次實現linux機器ssh免密shell指令碼Linux指令碼
- 自動輸入密碼使用root許可權開啟shell指令碼密碼指令碼
- 自動生成Sql--基於Mybatis的單表SqlSQLMyBatis
- PowerDesigner: 利用sql指令碼檔案逆生成模型SQL指令碼模型
- linux常用的shell指令碼Linux指令碼
- 「懶惰的美德」我用 python 寫了個自動生成給文件生成索引的指令碼Python索引指令碼
- shell指令碼案例指令碼
- 常用shell指令碼指令碼
- Linux Shell指令碼Linux指令碼
- Oracle利用coe_load_sql_profile指令碼繫結執行計劃OracleSQL指令碼
- shell擴充套件——免互動指令碼套件指令碼
- shell指令碼(6)-shell陣列指令碼陣列
- 程式碼上線的shell指令碼指令碼
- Shell指令碼實現Twitter的Snowflake演算法的ID生成器指令碼演算法
- specjvm自動化指令碼JVM指令碼
- 自動備份指令碼指令碼
- linux shell指令碼中 =~ 的作用Linux指令碼
- shell 指令碼加密 | shc指令碼加密
- 執行shell指令碼指令碼