Oracle sqlload 腳本

#!/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'



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章