oracle load.sh 导入文本

来源:互联网 发布:淘宝csgo买哪个版本 编辑:程序博客网 时间:2024/06/15 05:50
oracle load.sh 是通过shell对sqlldr重新封装,使sqlldr使用更方便,导入文本更方便,不用再很麻烦的配置sqlldr控制文件。
 
1 可以根据传入参数指定分隔符 -a
2 指定行结束符 -e
3 指定字段内容被特殊字符包裹 -ae
4 指定装入模式 -m
5 指定装入文本字符集
6 指定控制文件来源 -cm 若为A 追加 -c 自定义控制文件内容 若为H 则根据第一行标题 若为R则根据-c自定义控制文件导入
 
自定一控制文件格式为:
字段@字段处理
-----------------
eg:sqlldr.config
ETL_DT@"NVL(:ETL_DT,'2010-01-01')"
------------------------------------
如以上控制文件若ETL_DT 为空则写入'2010-01-01'
源码:
#!/bin/ksh############################################################################################脚本名称: load.sh#脚本功能: 导入数据文件到指定数据库的指定数据表中#涉及文件:#脚本调用: sh load.sh -u user -p passwd -i sid -a '|' -f file.unl -t tablename#脚本参数:    #输出文件: #返回值 : #使用实例:    # sh load.sh -u fhts -p fhts -i odsbptdb -a '|' -f tmp.unl -t tmp -m truncate# yyyy-mm-dd (日期格式,如果不填默认yyyymmdd)#编写人 : sqniu#编写日期: 2009/10/16###########################################################################################usage(){                echo                echo " $0(数据装载)"                echo " ===================="                echo " Usage:"                echo " sh $0 -u -p -i -t -f -a -e -d "                echo " 参数:"                echo " -u oracle数据库用户"                echo " -p oracle数据库密码"                echo " -i oracle tra_id"                echo " -t 要装载的数据库表"                echo " -f 需要装载数据文件(包括绝对路径)"                echo " [-a] 记录分隔符,默认为'|'"         echo " [-ae] 包含字段数据特殊符"         echo " [-d] 载入时间类型"                echo " [-l] 装载数据行数 默认全部装入"         echo " [-e] 载如文件的结束符"                echo " [-nls] 装载数据字符集 UTF8 或者ZHS16GBK"         echo " [-s] 跳过文件行数"         echo " [-m] 数据装载方式TRUNCATE APPEND INSERT,默认TRUNCATE"         echo " [-txt] 文件预处理S清除文件空格A文件尾加分隔符U文件转换UNIX格式"                echo " [-c] 参数文件 字段名@字段后置处理"         echo " [-cm] 参数文件内容默认追加,A 末尾追加,R 全量替换 ,H 依据文件头信息"                echo                exit -1}# 函数writeLog(){    echo -e $1    echo -e $1 >>$LOG}mk_control_file(){_USER_PSWD=$1_Separator=$2_File=$3_TableName=$4_Meathod=$5DescTempFile=${Base_File}.desc.$DescTempFile2=${Base_File}.2.desc.$SqlLog=${Base_File}.log.$sqlplus -S ${_USER_PSWD} <<TMP >>/dev/nullset echo off;set feedback off;set tab off;set heading off;set pagesize 0;set linesize 1000;set numwidth 12;set termout off;set trimout on;set trimspool on;spool ${DescTempFile};desc ${_TableName}spool off;TMPif [ $? != 0 ]then    writeLog "\n====================\n数据库连接错误!\n===================="    exit -1fiLine_File="AAAAA"if [ -f ${DescTempFile} ]then    cat ${DescTempFile}|sed '1,2d'|sed 's/[ ][ ]*/ /g'|sed '$d'|sed 's/^ //g'|awk '{if ($2=="DATE" || $4=="DATE") {print $1 " DATE \"'${DateType}'\""} else {print $1}}'|sed's/$/,/g'|sed '$s/,$//'|sed '/^$/d'|sed 's/NOT NULL //g'|sed 's/ VARCHAR2/ CHAR/g'|sed 's/ VARCHAR/ CHAR/g'>>${DescTempFile2}Line_File=`head -1 ${DescTempFile}`else        rm -f ${DescTempFile}        rm -f ${DescTempFile2}    writeLog "\n====================\n数据库连接错误!\n===================="    exit -1fiif [ ${Line_File:0:5} = "ERROR" ]thenrm -f ${DescTempFile}rm -f ${DescTempFile2}writeLog "\n====================\n表不存在!\n===================="exit -1fiecho "LOAD DATA ${Nls_String} INFILE '${_File}' ${Line_closed} BADFILE 'bad_${_TableName}.bad' ${_Meathod} INTO TABLE ${_TableName} FIELDS TERMINATEd BY \"${_Separator}\" " > ${Base_File}.ctlecho ${End_Sqlite} >>${Base_File}.ctlecho "TRAILING NULLCOLS ">>${Base_File}.ctlecho "(">>${Base_File}.ctlcat ${DescTempFile2} >>${Base_File}.ctlrm -f ${_TableName}rm -f ${DescTempFile}rm -f ${DescTempFile2}}mk_exec_shell(){_USER_PSWD=$1_Separator=$2_File=$3_TableName=$4_SkipRow=$5    echo "sqlldr ${_USER_PSWD} control=${Base_File}.ctl skip=${_SkipRow} ${Load_rows} rows=${CtlRow} errors=10000 bindsize=${BindSize} readsize=${ReadSize} log=log_${Base_File}.log bad=bad_${Base_File}.bad" > load_${Base_File}.sh}if [ $# -lt 5 ]then    echo "参数有误,请检查......"        usagefiwhile [ 1 ]    do        if [ "$1" = "-u" ]        then            shift 1            user=$1        fi        if [ "$1" = "-p" ]        then            shift 1            passwd=$1        fi        if [ "$1" = "-i" ]        then            shift 1            server=$1        fi        if [ "$1" = "-t" ]        then            shift 1            TableName=$1        fi        if [ "$1" = "-f" ]        then            shift 1            File=$1        fi    if [ "$1" = "-a" ]        then            shift 1            Separator=$1        fi    if [ "$1" = "-d" ]        then            shift 1            DateType=$1        fi    if [ "$1" = "-s" ]        then            shift 1            SkipLine=$1        fi      if [ "$1" = "-m" ]        then            shift 1            Meathod=$1        fi                if [ "$1" = "-l" ]        then            shift 1            Load_rows=$1        fi        if [ "$1" = "-ae" ]        then            shift 1            End_Sqlite=$1        fi        if [ "$1" = "-e" ]        then            shift 1            Line_closed=$1        fi        if [ "$1" = "-nls" ]        then            shift 1            Nls_String=$1        fi      if [ "$1" = "-c" ]        then            shift 1            Config=$1        fi        if [ "$1" = "-txt" ]        then            shift 1            Prepare=$1        fi    if [ "$1" = "-cm" ]        then            shift 1            ConfigP=$1        fi     shift 1        if [ $# -eq 0 ]        then            break        fi    done    if [ "$SkipLine" = "" ]    then        SkipLine=0    fi    if [ "$Separator" = "" ]    then        Separator="|"    fi    if [ "$DateType"x = ""x ]    then        DateType=yyyymmdd    fi    if [ "$Meathod" = "" ]    then        Meathod=TRUNCATE     fi    if [ "$End_Sqlite" != "" ]    then        End_Sqlite="OPTIONALLY ENCLOSED BY "$End_Sqlite    fi    if [ "$Load_rows" != "" ]    then        Load_rows="load="$Load_rows    fi    if [ "$Nls_String" != "" ]    then        Nls_String="CHARACTERSET "$Nls_String    fi    if [ "$Line_closed" = "w" ]    then        Line_closed=\""str "X\'0D0A\'\"    fiUSER_PSWD=$user/$passwd@$serverBase_File=`basename $File`# 环境变量区DATE=`date +%Y%m%d`LOG=$HOME/log/$DATE/LoadTable/$File.$DATE LOG_DIR=`dirname $LOG`CtlRow=100000BindSize=16384000ReadSize=16384000if [ ! -d $LOG_DIR ]then    mkdir -p $LOG_DIR    retcode=$?    if [ "$retcode" != "0" ]    then        echo -e "\n==================\n 不能创建日志文件路径\n=================="        exit -1    fifiif [ ! -f $LOG ]then    >$LOG    retcode=$?    if [ "$retcode" != "0" ]    then        echo -e "\n==================\n 不能创建日志文件 \n==================="        exit -1    fifi   cp $File ${File}.tempif [ "${Prepare:0:1}" = "U" ] || [ "${Prepare:1:1}" = "U" ] || [ "${Prepare:2:1}" = "U" ]then   dos2unix ${File}.tempfi if [ "${Prepare:0:1}" = "S" ] || [ "${Prepare:1:1}" = "S" ] || [ "${Prepare:2:1}" = "S" ]then      sed -i 's/ //g' ${File}.tempfiif [ "${Prepare:0:1}" = "A" ] || [ "${Prepare:1:1}" = "A" ] || [ "${Prepare:2:1}" = "A" ]then      sed -i 's/$/'${Separator}'/g' ${File}.tempfimk_control_file $USER_PSWD $Separator ${File}.temp $TableName $Meathodif [ "$ConfigP" = "" ]then        echo ")">>${Base_File}.ctlfiif [ "$ConfigP" = "A" ]then       while read LINE       do       if [ `echo ${LINE:0:1}` == '#' ]       then       continue       fi       Tab_Line1=`echo ${LINE}|awk -F '@' '{print $1}'|tr a-z A-Z`       Tab_Line2=`echo ${LINE}|awk -F '@' '{print $2}'`       sed -i 's/'${Tab_Line1}'/'${Tab_Line1}${Tab_Line2}'/g' ${Base_File}.ctl       done<${Config}fiif [ "$ConfigP" = "R" ]then           sed -i '5,$d' ${Base_File}.ctl       while read LINE       do       if [ `echo ${LINE:0:1}` == '#' ]       then       continue       fi       Tab_Line1=`echo ${LINE}|awk -F '@' '{print $1}'|tr a-z A-Z`       Tab_Line2=`echo ${LINE}|awk -F '@' '{print $2}'`       echo ${Tab_Line1}${Tab_Line2},>> ${Base_File}.ctl       done<${Config}       sed -i '$s/,$//' ${Base_File}.ctl       sed -i '/^$/d' ${Base_File}.ctl    echo ")" >>${Base_File}.ctlfiif [ "$ConfigP" = "H" ]then        SiikipLine=1        sed -i '5,$d' ${Base_File}.ctl        head -1 ${File}.temp >${Base_File}.hctl        sed -i 's/'${Separator}'/,/g' ${Base_File}.hctl        sed -i '$s/,$//' ${Base_File}.hctl        sed -i '/^$/d' ${Base_File}.hctl        cat ${Base_File}.hctl >>${Base_File}.ctl        echo ")" >>${Base_File}.ctlfimk_exec_shell $USER_PSWD $Separator ${File}.temp $TableName $SkipLineecho -e "\n=================================\n日志:log_${Base_File}.log\n=================================


原创粉丝点击