ORACLE数据导入Shell程序

#!/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就可以导入数据库,内容文件以"|"来区分各字段

阅读更多
换一批

没有更多推荐了,返回首页