通过sqlldr工具加载数据入Oracle库表

无情 阅读:173 2022-06-06 14:05:08 评论:0

通过sqlldr工具加载数据入Oracle库表

前言

本文主要是贴源码,即如何通过shell脚本,用sqlldr工具加载数据入Oracle库表。

其中sqlldr工具的详细参数说明,可参考我的另一篇博文:

脚本实现

使用Oracle中sqlldr工具加载数据入Oracle数据库

日志文件路径在脚本中可自定义调整

参数说明

执行脚本需传入5个参数

  • dbSid: Orale库SID
  • dbUser: Oracle数据库用户名
  • dbPass: Oracle数据库密码
  • ctlFile: 数据控制文件(关键信息,可参考下面示例)
  • dataPath: 数据文件路径(即下述ctl控制文件中的数据文件路径/home/mds/file/input/add/TEST

ctl控制文件说明

ctl控制文件记录关键的入库信息,根据实际情况自定义调整

  • 加载方式
  • 数据文件
  • 数据结构
  • 分隔符

CTL文件示例

OPTIONS (DIRECT=true,SKIP_INDEX_MAINTENANCE=true,ERRORS=0) 
LOAD DATA 
CHARACTERSET AL32UTF8 
infile '/home/mds/file/input/add/TEST/ora_data.txt' 
TRUNCATE 
into table user_info  
fields terminated by '|' 
trailing nullcols 
( 
USER_ID, 
USER_NAME, 
PHONE, 
ADDRESS 
) 

脚本源码

#!/bin/bash 
 
#Define database params 
dbSid=$1 
dbUser=$2 
dbPass=$3 
ctlFile=$4 
dataPath=$5 
 
ctlName=`basename ${
    
     ctlFile}` 
 
#Sys data [yyyymmdd] 
sysDate=`date +'%Y%m%d'` 
 
#Define log params 
logPath=/app/log/public/ora_load_data/${sysDate} 
logFile=${logPath}/${ctlName}.log 
logTemp=${logPath}/${ctlName}.tmp 
#Define temp log file for sqlldr, show in moia 
badFile=${logPath}/${ctlName}.bad 
 
#Log function 
Log() 
{
   
     
  createTime=`date  +"%Y-%m-%d %H:%M:%S"` 
  echo "[${createTime}] $*" |tee -a ${logFile} 2>/dev/null 
} 
 
#CheckDir function 
CheckDir() 
{
   
     
  if [ ! -d $1 ]; then 
    mkdir_log=` mkdir -p -m 775 $1 ` 
    if [ $? -ne 0 ]; then 
      Log "[Error] [$1] create failed, dir not exist, please check..." 
      exit 255 
    fi     
  fi 
} 
CheckDir "${logPath}" 
 
###################   Main program   ################### 
#check the parameter 
if [ $# -ne 5 ]; then 
   Log "[Error] Please input the right parameter ..." 
   Log "[Error] Eg:sh ora_load_data.sh oraSid user passwd /app/file/userinfo.ctl /app/file/20200630" 
   exit 255 
fi 
 
#Check ctlFile 
if [ ! -f ${ctlFile} ];then 
    Log "[Error] ${ctlFile} not exist, please check..." 
    exit 255 
fi 
 
#Check dataPath 
if [ ! -d ${dataPath} ];then 
    Log "[Error] ${dataPath} not exist, please check..." 
    exit 255 
fi 
 
cd ${dataPath} 
if [ $? -ne 0 ];then 
    Log "[Error] Failed to change path ${dataPath}..." 
    exit 255 
fi 
 
#Check datafile 
datafile=`cat ${
    
     ctlFile}| grep infile |awk -F \' '{
    
     print $2}'` 
if [ ! -f ${datafile} ];then 
   Log "[Error] ${datafile} not exists,please check..." 
   exit 11 
fi 
 
Log "sqlldr ${dbUser}/${dbPass}@${dbSid} errors=100 control=${ctlFile} bad=${badFile} rows=3000 bindsize=33554432 > ${logFile} 2>&1" 
sqlldr ${dbUser}/${dbPass}@${dbSid} errors=100 control=${ctlFile} bad=${badFile} log=${logTemp} rows=3000 bindsize=33554432 > ${logFile} 2>&1 
 
cat ${logTemp} 
 
if [ $? -ne 0 ];then 
    Log "[Error] Failed to load data from ${ctlFile}..." 
        Log "$*" 
    exit 1 
else 
    Log "Succ to load data from ${ctlFile}." 
fi 

结语

如有需要请拿走,若转载请追加本文链接哦!

既然有装数,那就要有卸数,请参考通过spool工具抽取Oracle数据库表数据落地文件……

能学一点是一点,至少不是0!

Over!


标签:mysql
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

搜索
排行榜
关注我们

一个IT知识分享的公众号