想法:

看了公司的远端的服务器上自动跑数据的流程,本来是做报表用的。我突然灵感乍现,倘若在本地搞一个跑一些日常任务岂不是很舒服,生成好一些文件,自己再加工一下就可以提交了。嘿嘿

实现平台:windows10,oracle

实现借助工具:

本地window10定时任务: 实现定时执行

bat脚本:调用其他程序,备份文件 自己只会简单的使用(各种查,简单的用不是太难)

oracle的sqlplus: 执行sql脚本

oracle的sqluldr264(我的windows10 64位): 导出数据。(也可以用kettle,二者都行)

实现流程:

第一步:编写bat脚本。

ps:sql脚本我就不说是啥了,哈哈,我是用来聚合数据的。你可以根据自己的情况想怎么弄都行。

脚本一:

作用:cmd调用sqlplus执行sql脚本。

示例:

set file_name=cy_month日志记录%date:~0,4%%date:~5,2%%date:~8,2%.txt

sqlplus wx_tjjj/Mesi_bjtjwx_620@101.777.77.77:1521/itj @"F:\cyscript\sqlscript\cy_month.sql" > F:\cyscript\sqlscript\log\%file_name%

exit

解释:设置一个变量file_name,然后调用sqlplus执行sql脚本,并生成日志放在对应位置。

脚本二:

作用:cmd调用sqluldr264(导出数据)。

示例:

set cytime=%date:~0,4%%date:~5,2%%date:~8,2%

::按记录数切分文件的功能取决于三个命令行选项: FILE, ROWS, BATCH. 其中FILE选项指定的文件名中需要包括”%b”特征串, 以表示生成的文件号. ROWS指定单个文件的记录数, 而BATCH则指定是否切换成多个文件
head值包含表头

sqluldr264 user="wx_77tj/Messi_bjx_0620@10.7777.32.37:11421/imtj" query="select * from cy_script_sanweiyiti_24h" field="," record=0x0a  head=yes file="C:/Users/Administrator/Desktop/everymonth/三位一体/三位一体24H服务量%cytime%.csv" charset=UTF8  safe=yes

exit

解释:设置一个时间变量cytime,::后为注释(解释下面语句一些配置的意思),调用sqluldr264导出数据。

脚本三:

作用:备份sql脚本,因为这个我们可以一直加sql语句,难免手误改错地方了,可以看下记录还原,快速恢复。

示例:

echo off
echo ********开始备份日志文件********
 
set ymd=%date:~0,4%%date:~5,2%%date:~8,2%
set backup-dir=sql备份\sql-%ymd%
echo 备份目录:%backup-dir%
 
echo --------------------------------
 
if not exist %backup-dir% (
    mkdir %backup-dir%
)
 
copy *.sql %backup-dir%
 
echo *********日志备份完成!*********

exit

解释: 设置变量ymd,backup-dir,如果不存在backup-dir目录就创建,复制当前目录下以.sql结尾的文件到创建的目录,结束(echo 意思就是在窗口输出这句话)

第二步:window定时任务。

这个window10本身就有,很简单,百度一下就行了

需要注意的是bat脚本执行的顺序,先执行脚本一,后执行脚本二,脚本三就无所谓了。

感想:

写完感觉好像也没啥东西,但是自己也是断断续续搞了一两天。主要是脚本那块不熟,各种测试。本来导出可以用kettle的,很快就搞完了,但是我觉得没怎么用过sqluldr264,就尝试了一把,导出速度蛮快的,和kettle比差不多,感觉,它还有很多其他的配置,可以设置数据数量,分文件导出,我之前一直想这样搞分批次自动导数据,现在也算是知道了一种方法。

sqluldr264分批次导出:

  sqluldr2_linux64_10204.bin user="username/pwd" sql="/opt/sql/query.sql" field="0x09" record=0x0a rows=100000 batch=yes file="/opt/data/table.%b.txt" charset=UTF8

我当时配置好运行报错:ORA-24345: A Truncation or null fetch error occurred

解决方法有两种:

1.在语句中加入参数:safe=yes

2.字符编码转换,把charset=UTF-8 改成 charset=ZHS16GBK就可以了

以上两种,我亲测可用,至于你行不行我就不知道了,因为我看到网上有人只能用第二种。

还有就是编写bat脚本,我的windows10编码是ANSI的,不然运行一些中文会乱码,如果涉及到文件名会执行失败,不要问我为啥知道,我从坑里爬出来的。哈哈

以上是我做完后根据记忆写的,如果有错误可以留言,我看到会纠正。