ORACLE数据导入Shell程序

这是一个使用Shell脚本批量导入Oracle数据库的教程。脚本首先检查参数数量、数据文件是否存在,然后通过SQL*Plus获取表结构并生成控制文件。接着,它处理这些文件以准备数据导入,并使用SQL*Loader执行导入操作。最后,脚本会输出导入结果,成功或失败。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值