该实例实现了FTP传输、解压缩、文件预处理(采用java)、sqlldr加载、以及加载后处理等一系列过程。
@echo off&setlocal enabledelayedexpansion color a rem 数据库参数 rem 要将运行该脚本的操作系统的日期格式调整为2012-01-01 标准的YYYY-MM-DD格式 rem 需要安装7-ZIP ,并把7-zip的添加到系统路径 path rem 需要安装 1.6 版本以上的jdk rem 本脚本的默认执行模式为按天执行,请按照协议的文件名称修改FILENAME的变量的定义
rem 本示例接口文件的为hwsj_20120102.txt.gz 其中文件名日期
rem 其中java部分主要为对文件编码,换行符进行处理的过程,根据具体情况修改处理方法
set USERCODE=gd_114 set PASSWORD=a set DATABASE=btsz set FILENAME=hwsj_%date:~0,4%%date:~5,2%%date:~8,2%.txt.gz set TXTNAME=hwsj_%date:~0,4%%date:~5,2%%date:~8,2%.txt echo *------------begin-------------* >>log.txt echo *------------------------------* >>log.txt echo 开始时间:>>log.txt echo %date% %time% >>log.txt echo 准备接受数据文件:%FILENAME% >>log.txt copy ftp_file.txt tmp1.txt >>log.txt for /f "tokens=1 delims=" %%i in (tmp1.txt) do ( set var=%%i set "var=!var:FTPFILE=%FILENAME%!" echo !var!>>tmp2.txt ) move /Y tmp2.txt ftp_body2.txt >>log.txt copy ftp_body*.txt ftp_body_all.txt echo 从FTP上获取数据......... ftp -s:ftp_body_all.txt >> log.txt del ftp_body2.txt del tmp1.txt rem 暂停3秒钟,确保文件能够覆盖 ping -n 3 127.1>nul echo 正在解压缩文件......... 7z x %CD%\%FILENAME% -o%CD%\data_source\ -aoa >>log.txt echo 正在对文件格式进行处理......... java MaintainLogFile %CD%\data_source\%TXTNAME% %CD%\data\%TXTNAME% >>log.txt echo 正在删除压缩文件......... del %CD%\hwsj_*.txt.gz echo 正在清空历史数据......... rem 清空数据库数据并备份上一次的数据文件 sqlplus "%USERCODE%/%PASSWORD%@%DATABASE%" @%CD%/script/pro_prepare.sql echo 正在使用sqlldr加载数据......... sqlldr userid=%USERCODE%/%PASSWORD%@%DATABASE% data='%CD%\data\%TXTNAME%' control='%CD%\script\train.ctl' direct=true log='%CD%\log_sqlExecute\LOAD_LOG_%FILENAME%.log' bad='%CD%\data_bad\BAD_DATA_%FILENAME%.log' errors=5000 rows=2000 echo 正在对数据进行加工......... sqlplus "%USERCODE%/%PASSWORD%@%DATABASE%" @%CD%/script/pro_main.sql echo 结束数据时间:>>log.txt time /t >>log.txt echo *------------------------------* >>log.txt echo *------------end---------------* >>log.txt exit
我的sqlldr控制文件如下:
load data into table imp_114_log insert fields terminated by '*?,' TRAILING NULLCOLS ( WORKERID "trim(:WORKERID )", CALLINGNUM "trim(:CALLINGNUM)", CALLEDNUM "trim(:CALLEDNUM)", STARTDT "trim(:STARTDT)", ENDDT "trim(:ENDDT)", QUERYWORD "trim(:QUERYWORD)", FACTWORD "trim(:FACTWORD)", BROADCASTCONTENT CHAR(2000) "SUBSTR(trim(:BROADCASTCONTENT),1,1000)", VOICETYPE "trim(:VOICETYPE)", CITYCODE "trim(:CITYCODE)", WORKERNAME "trim(:WORKERNAME)", UNITID "trim(:UNITID)", BROADCASTDT "trim(:BROADCASTDT)", UNITNAME CHAR(2000) "SUBSTR(trim(:UNITNAME),1,500)", UNITTEL "trim(:UNITTEL)", BUSINESSTYPE "trim(:BUSINESSTYPE)" )
ftp_body1.txt
open 192.168.240.118
sa
sa
cd ./
ascii
ftp_file.txt
get FTPFILE
bye
1、SQL*Loader 数据的提交:
一般情况下是在导入数据文件数据后提交的。
也可以通过指定 ROWS= 参数来指定每次提交记录数。
2、提高 SQL*Loader 的性能:
1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。
2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。
3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。
4) 可以同时运行多个导入任务.
常规导入与direct导入方式的区别:
常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。
3、parallel参数并不是让一个sqlldr语句起多个进程来加载数据,而是不锁住加载表,允许别的直接路径加载. 所以要使parallel起作用,应该先将要加载的数据文件分成多个,用多个sqlldr语句同时加载,如下例:
sqlldr userid=scott/tiger control=load1.ctl data=data1.txt direct=y parallel=true &
sqlldr userid=scott/tiger control=load2.ctl data=data2.txt direct=y parallel=true &
sqlldr userid=scott/tiger control=load3.ctl data=data3.txt direct=y parallel=true &)