您的位置:首页 > 数据库 > Oracle

oracle 数据批量导入工具

2016-06-16 00:00 453 查看
摘要: oracle 数据批量导入-针对几千万条数据

#!/bin/ksh---- 如果文件的第一个字符不是#说明使用的是Bsh,如果第一个字符是#则使用Csh,
如果第一个字符#后面跟!/bin/ksh,说明该脚本使用指定的shell 执行,即为/bin目录下的ksh解释执行. ‘#’是注释符,‘!’紧跟着‘#’一起表示在执行这个脚本时
使用其后的“/bin/ksh”解释器执行脚本文件中后面的内容。
同时“/bin/ksh”表示解释器所在的路径

basedir是一般工作目录。

homedir是登录后的目录(终端)。





/bin 二进制可执行命令

/dev 设备特殊文件
/etc 系统管理和配置文件
/etc/rc.d 启动的配置文件和脚本
/home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin 超级管理命令,这里存放的是系统管理员使用的管理程序
/tmp 公共的临时文件存储点
/root 系统管理员的主目录
/mnt 系统提供这个目录是让用户临时挂载其他的文件系统
/lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,比方说各种服务的日志文件
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录,其中包含:

/usr/x11R6 存放x window的目录
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库根文件系统

#表数据导入

HOMEDIR=$PWD--当前目录

THISNAME=`basename $0`

usage(){
echo
echo "Oracle库表数据导入"
echo "========================="
echo
echo "Usage:"
echo " $THISNAME -Uuser -Ffilename -Ttblname "
echo
echo "Parameter:"
echo " -U 用户名/密码@服务名"
echo " -F 数据文件名"
echo " -T 表名"
echo
exit 1
}

# 参数分析
#echo "入参个数[$#]"
if [ $# -ne 3 -a $# -ne 6 ] ;then
usage ;
fi

while getopts U:P:F:T: OPTION
do
case $OPTION in
U) DBUSR=$OPTARG
#echo "用户名:[${DBUSR}]"
;;
F) DATAFILE=$OPTARG
#echo "导入文件名:[${DATAFILE}]"
;;
T) TBLNAME1=$OPTARG
TBLNAME=${TBLNAME1};
#echo "导入文件名:[${TBLNAME1}]"
;;
?) usage ;;
*) usage ;;
esac
done

rm ${TBLNAME}.ctl
#下载表数据
# if [ -z "$DBUSR" ] || [-z "$DATAFILE"] || [-z "$TBLNAME1"]; then
# echo "Usage:load -U 用户名/密码@服务名 -F 数据文件名 -T 表名\n"
# exit
# fi

echo "表[$TBLNAME]开始导入\n"
SQLFILD="COLUMN_NAME ||decode(sign(DATA_LENGTH-255),1,concat(concat(' char(', DATA_LENGTH), ')')) "
sqlwhere="table_name=upper('$TBLNAME')"

SQLS="select ${SQLFILD} from user_tab_columns where ${sqlwhere} order by table_name,column_id;"

#echo $SQLS

sqlplus -S ${DBUSR} <<-!!! >/dev/null
set colsep '|'
set heading off
set feedback off
set pagesize 0
set linesize 3000
set echo off
set termout off
set verify off
set numwidth 16
set trimspool on

spool ${TBLNAME}.a

${SQLS}
spool off
!!!
HEAD="load data infile '${DATAFILE}' append into
table ${TBLNAME} FIELDS TERMINATED BY \"|\" TRAILING NULLCOLS ("
cat ${TBLNAME}.a | sed 's/$/,/g' | sed 's/ *//g'|sed -n '1,$p' > ${TBLNAME}.b
cat ${TBLNAME}.b | sed '$s/,//'|sed -n '1,$p' > ${TBLNAME}.a

#echo "控制文件头:[${HEAD}]"
echo $HEAD>${TBLNAME}.txt
echo ")">tail.txt
cat ${TBLNAME}.txt ${TBLNAME}.a tail.txt>${TBLNAME}.c
cat ${TBLNAME}.c | sed 's/char(/ char(/g'|sed -n '1,$p'>${TBLNAME}.ctl

rm ${TBLNAME}.txt
rm tail.txt
rm ${TBLNAME}.a
rm ${TBLNAME}.b
rm ${TBLNAME}.c

if [ $? -ne 0 ]; then
echo "生成表[$TBLNAME]控制文件失败\n"
fi
echo "生成表[$TBLNAME]控制文件完成,导入数据,请查看结果\n"

sqlldr ${DBUSR} control=${TBLNAME}.ctl log=${TBLNAME}.log bad=${TBLNAME}.bad errors=10000
retcode=`echo $?`
case "$retcode" in
0) echo "\nSQL*Loader execution successful" ;;
1) echo "\nSQL*Loader execution exited with EX_FAIL, see logfile" ;;
2) echo "\nSQL*Loader execution exited with EX_WARN, see logfile" ;;
3) echo "\nSQL*Loader execution encountered a fatal error" ;;
*) echo "unknown return code";;
esac
echo "表[$TBLNAME]导入结束\n"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: