FTP 文件接口按天批处理脚本实例

时间:2022-05-31 23:11:52

该实例实现了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 &)