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

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/3d87093d/

通过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文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
)

脚本源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/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

蚂蚁再小也是肉🥩!


通过sqlldr工具加载数据入Oracle库表
http://heibanbai.com.cn/posts/3d87093d/
作者
黑伴白
发布于
2022年1月12日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付