#!/usr/bin/ksh
#oracle数据载入shell
if [ $# -ne 3 ] #如果参数不等于3个
then
echo "load.ori user/passwd table_name data_file"
exit
fi
if [ ! -f $3 ] #如果第三个参数不是文件
then
echo "$3 : file no found"
exit
fi
sqlplus $1 <<! >/dev/null #使用desc把表结构信息写到/tmp/tmp_table.lst中
spool /tmp/temp_table.lst;
desc $2
spool off;
exit
!
if [ "$?" -ne 0 ] #如果执行后不等于0,说明出错
then
echo "Error:sqlplus $1 error in generate control file for table $2 !"
echo "please check userid and passwd or oracle_sid."
exit
fi
if [ -f /tmp/temp_table.lst ] #如果/tmp/temp_table.lst是一个文件
then
lv_line_num=`cat /tmp/temp_table.lst | wc -l` #得到文件行数
lv_line_num=`expr ${lv_line_num} - 2` #减去2行
#从起始到lv_line_num行的内容定向到另一文件(去掉末尾2行内容)
head -${lv_line_num} /tmp/temp_table.lst >/tmp/temp_table
lv_line_num=`expr ${lv_line_num} - 3` #减去3行
#从末尾到lv_line_num行的内容定向到另一文件(去掉开头3行内容)
tail -${lv_line_num} /tmp/temp_table >/tmp/temp_table.lst
#使用awk命令(打印第一个参数),读取文件中的第一列定向到另一文件,得到表字段
cat /tmp/temp_table.lst|awk '{print $1}' >/tmp/temp_table
#组合导入命令,以"|"分开文件中的每列内容
lv_str="LOAD DATA INFILE '$3' BADFILE 'bad_$2.bad' TRUNCATE INTO TABLE $2 FIELDS TERMINATEd BY /"|/""
echo ${lv_str}
echo ${lv_str} > /tmp/temp_table.lst #把此段命令定向到一文件
echo "(" >> /tmp/temp_table.lst #此段命令后面换行加上一个"("
ed /tmp/temp_table <<! >/dev/null #编辑字段文件
$ #到最后一行
1,.s/$/,/ #从第一行到当前行,把末尾($)替换成(,)
w #写入到文件中
$ #到最后一行
.,.s/,$// #把最后的(,)替换成空,去掉最后这个(,)
w #写入到文件中
q
!
cat /tmp/temp_table>>/tmp/temp_table.lst #追加到刚才那段命令语句后面
echo ")" >> /tmp/temp_table.lst #加上")"
else
echo "$0 error :not find table describe file."
exit
fi
lv_rows=10000
lv_bindsize=8192000
lv_readsize=8192000
#使用sqlldr执行上面组合好的语句,导入数据
sqlldr $1 control=/tmp/temp_table.lst rows=10000 bindsize=8192000 readsize=8192000 log=/tmp/${2}.log bad=/tmp/${2}.bad direct=true
if [ "$?" != "0" ]
then
echo "load failed."
else
echo "load success."
fi
#上述control内容语句举例为
LOAD DATA INFILE 'table.unl' BADFILE 'bad_tabel.bad' TRUNCATE INTO TABLE table FIELDS TERMINATED BY /"|/"
(
FIELDS1,
FIELDS2,
FIELDS3
)
使用sqlldr就可以导入数据库,内容文件以"|"来区分各字段