热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracleload.sh导入文本

oracleload.sh是通过shell对sqlldr重新封装,使sqlldr使用更方便,导入文本更方便,不用再很麻烦的配置sqlldr控制文件。
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=$5

DescTempFile=${Base_File}.desc.$
DescTempFile2=${Base_File}.2.desc.$
SqlLog=${Base_File}.log.$
sqlplus -S ${_USER_PSWD} <>/dev/null
set 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;
TMP
if [ $? != 0 ]
then
    writeLog "\n====================\n数据库连接错误!\n===================="
    exit -1
fi
Line_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 -1
fi

if [ ${Line_File:0:5} = "ERROR" ]
then
rm -f ${DescTempFile}
rm -f ${DescTempFile2}
writeLog "\n====================\n表不存在!\n===================="
exit -1
fi

echo "LOAD DATA ${Nls_String} INFILE '${_File}' ${Line_closed} BADFILE 'bad_${_TableName}.bad' ${_Meathod} INTO TABLE ${_TableName} FIELDS TERMINATEd BY \"${_Separator}\" " > ${Base_File}.ctl
echo ${End_Sqlite} >>${Base_File}.ctl
echo "TRAILING NULLCOLS ">>${Base_File}.ctl
echo "(">>${Base_File}.ctl
cat ${DescTempFile2} >>${Base_File}.ctl
rm -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 "参数有误,请检查......"
        usage
fi

while [ 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\'\"
    fi
USER_PSWD=$user/$passwd@$server

Base_File=`basename $File`

# 环境变量区
DATE=`date +%Y%m%d`
LOG=$HOME/log/$DATE/LoadTable/$File.$DATE 
LOG_DIR=`dirname $LOG`
CtlRow=100000
BindSize=16384000
ReadSize=16384000

if [ ! -d $LOG_DIR ]
then
    mkdir -p $LOG_DIR
    retcode=$?
    if [ "$retcode" != "0" ]
    then
        echo -e "\n==================\n 不能创建日志文件路径\n=================="
        exit -1
    fi
fi
if [ ! -f $LOG ]
then
    >$LOG
    retcode=$?
    if [ "$retcode" != "0" ]
    then
        echo -e "\n==================\n 不能创建日志文件 \n==================="
        exit -1
    fi
fi

   cp $File ${File}.temp
if [ "${Prepare:0:1}" = "U" ] || [ "${Prepare:1:1}" = "U" ] || [ "${Prepare:2:1}" = "U" ]
then
   dos2unix ${File}.temp
fi
 
if [ "${Prepare:0:1}" = "S" ] || [ "${Prepare:1:1}" = "S" ] || [ "${Prepare:2:1}" = "S" ]
then
      sed -i 's/ //g' ${File}.temp
fi
if [ "${Prepare:0:1}" = "A" ] || [ "${Prepare:1:1}" = "A" ] || [ "${Prepare:2:1}" = "A" ]
then
      sed -i 's/$/'${Separator}'/g' ${File}.temp
fi

mk_control_file $USER_PSWD $Separator ${File}.temp $TableName $Meathod
if [ "$ConfigP" = "" ]
then
        echo ")">>${Base_File}.ctl
fi

if [ "$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}
fi

if [ "$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}.ctl
fi


if [ "$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}.ctl
fi

mk_exec_shell $USER_PSWD $Separator ${File}.temp $TableName $SkipLine
echo -e "\n=================================\n日志:log_${Base_File}.log\n=================================



推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • OCI连接MySQL_PLSQL Developer连接远程数据库OCI客户端安装方法
    本文介绍了使用OCI客户端连接MySQL和PLSQL Developer连接远程数据库的安装方法,避免了在本地安装Oracle数据库或类似的开发套件的麻烦,同时解决了PLSQL Dev连接远程Oracle时的配置问题。 ... [详细]
  • RMAN中的不完整恢复是指通过还原所有数据文件将整个数据库回退,然后执行不完全恢复的操作。不完整恢复的场景包括完整恢复不可行或故意要丢失数据。完整恢复需要备份后生成的所有归档日志和联机重做日志,而如果这些日志缺失或损坏,恢复将在该点停止。决定故意丢失数据是在用户错误发生后采取的行动,例如忘了where条件导致整个表受影响。对于已提交的事务来说,这样的更改是不可逆的。 ... [详细]
  • 在Android Studio中查看SQLite数据库
    原来查看数据库内容,我们一般都是将数据库文件从手机导出,再用专门的软件打开查看,比较繁琐。最近发现了一个比较方便的方法:使用工具stetho。使用方式在gradle中配置depen ... [详细]
  • SQLite3是一个广泛使用的数据库,从linux,windows到安卓都有SQLite的应用。本文介绍SQLite3在windows上的编译。SQLite3提供了多种源代码的下载 ... [详细]
  • 数据库锁在SQLite中,锁和事务是紧密联系的。为了有效地使用事务,需要了解一些关于如何加锁的知识。SQLite采用粗放型的锁。当一个连接要写数据库,所有其它的连接被锁住,直到写连接 ... [详细]
  • 最近用到SQLite数据库,刚开始想用ADO来搞,毕竟经常用,结果发现还挺麻烦,要装SQLite的ODBC驱动,装了以后还是连不上,听说这SQLite是开源项目,可以将开发库引入项目来 ... [详细]
author-avatar
华仔很忙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有