#!/bin/bash
##################
#@author: chichuduxing
#@date: 20160913
##################
#加載環境變量(需要加載oracle的環境變量,根據安裝情況自己調整)
if [ -f /etc/profile.d/oraenv.sh ];then
source /etc/profile.d/oraenv.sh
fi
#打印幫助信息
function showhelp()
{
#有特殊字符的時候一定要用單引號括起來
echo -e "\033[32musage: sh `basename $0` [-c 'uname/passwd@ip:port/sid'] [-t 'tablename'] [-e 'field1,field2'] [-f 'filename'] [-s 'splitchar']\033[0m"
echo -e "\033[31mevery param can not empty, please check!\033[0m"
}
while getopts c:e:f:s:t: OPT; do
case $OPT in
c|+c)
dbconn="$OPTARG"
;;
t|+t)
tablename="$OPTARG"
;;
e|+e)
fields="$OPTARG"
;;
f|+f)
filename="$OPTARG"
;;
s|+)
splitchar="$OPTARG"
;;
*)
showhelp
exit 1
esac
done
#檢查oracle環境
function checkenv()
{
if [ -z "$ORACLE_HOME" ] ;then
echo -e "\033[31mORACLE_HOME is empty! please install oracle client!\033[0m"
exit 2
fi
}
#檢查用戶輸入的變量
function checkvalue()
{
if [ "" = "$dbconn" -o "" = "$fields" -o "" = "$filename" -o "" = "$splitchar" ] ;then
showhelp
exit 3
fi
if [ ! -e "$filename" -o ! -s "$filename" ] ;then
echo "[${filename}] not exist or is empty!"
exit 3
fi
echo "dos2unix [${filename}] now..."
dos2unix ${filename} >/dev/null 2>&1
}
#對用戶的輸入進行轉換
function transvalue()
{
#生成文件名並清理
ctlfilename="load_${tablename}.ctl"
logfilename="load_${tablename}.log"
badfilename="load_${tablename}.bad"
if [ -e $ctlfilename ];
then
rm -f $ctlfilename
fi
if [ -e $logfilename ];
then
rm -f $logfilename
fi
if [ -e $badfilename ];
then
rm -f $badfilename
fi
#對字段增加char(4000)
sourcefields=$fields
temp=${fields//,/ }
fields="";
for onefield in $temp
do
if [ -z "${fields}" ] ;then
fields="${onefield} char(4000)"
else
fields="${fields}, ${onefield} char(4000)"
fi
done
echo -e "\033[33mTrans FIELDS [${sourcefields}] to [$fields]\033[0m"
#對分隔符進行處理,避免輸入的時候沒有轉義或者沒有使用單引號
sourcesplitchar=$splitchar
if [ "t" = "$splitchar" ] ;then
#處理\t
echo -e "\033[33mTrans SPLITCHAR [${splitchar}] to [\\\t]\033[0m"
splitchar="\t"
elif [ "u" = "${splitchar:0:1}" ] ;then
#處理\uxxxx
echo -e "\033[33mTrans SPLITCHAR [${splitchar}] to [\\${splitchar}]\033[0m"
splitchar="\\${splitchar}"
fi
}
#打印轉換後的用戶輸入
function showinfo()
{
echo -e "\033[34m##################show info##################\033[0m"
echo -e "\033[34mDBCONN :[${dbconn}]\033[0m"
echo -e "\033[34mTABLENAME :[${tablename}]\033[0m"
echo -e "\033[34mFIELDS :[${fields}]\033[0m"
echo -e "\033[34mSOURCE FIELDS:[${sourcefields}]\033[0m"
echo -e "\033[34mFILENAME :[${filename}]\033[0m"
echo -e "\033[34mSPLITCHAR :[${splitchar}] SOURCE VALUE:[${sourcesplitchar}]\033[0m"
echo -e "\033[34mCTLFILENAME :[${ctlfilename}]\033[0m"
echo -e "\033[34mLOGFILENAME :[${logfilename}]\033[0m"
echo -e "\033[34mBADFILENAME :[${badfilename}]\033[0m"
echo -e "\033[34m##################show info##################\033[0m"
}
function confirm()
{
read -p "is info ok? [yes/no] :" input
while [ ${input} != "yes" -a ${input} != "no" ]
do
read -p "input error,please write [yes/no] :" input
done
if [ $input = "no" ];then
echo -e "\033[33m*************** script exit ***************\033[0m"
exit 7
fi
}
#生成ctl文件
function writectl()
{
echo "LOAD DATA" > $ctlfilename
echo "INFILE '$filename'" >> $ctlfilename
echo "append into table $tablename" >> $ctlfilename
echo "fields terminated by '$splitchar' TRAILING NULLCOLS" >> $ctlfilename
echo "($fields)" >> $ctlfilename
if [ ! -e "$ctlfilename" -o ! -s "$ctlfilename" ] ;then
echo "write ${ctlfilename} failed! ${ctlfilename} not exist or is empty ,please check!"
exit 4
else
echo "------write ${ctlfilename} done!-----"
cat $ctlfilename
echo "---------------------------------------------"
fi
}
#執行sqlload入庫
function sqlload()
{
echo "Load command :$ORACLE_HOME/bin/sqlldr userid=$dbconn control=$ctlfilename log=$logfilename bad=$badfilename readsize=10240000 bindsize=10240000 errors=100000 direct=false"
$ORACLE_HOME/bin/sqlldr userid=$dbconn control=$ctlfilename log=$logfilename bad=$badfilename readsize=10240000 bindsize=10240000 errors=100000 direct=false >/dev/null
if [ $? -ne 0 ] ;then
echo -e "\033[31msqlldr failed ,please check the sqlldr command!\033[0m"
exit 5
fi
if [ -e "${badfilename}" ] ;then
echo -e "\033[31mload failed ,please read ${badfilename} and ${logfilename}\033[0m"
exit 6
else
echo -e "\033[32m########## load ${filename} to table ${tablename} done! more info in ${logfilename} ##########\033[0m"
fi
}
function main()
{
checkenv
checkvalue
transvalue
showinfo
writectl
confirm
sqlload
}
main
使用樣例:
sh sqlload.sh -c 'scott/[email protected]:1521/ora11g' -t 'tb_load_test' -e 'userid,username,timestamp' -f 'user.txt' -s '\t'