定时从Oracle导出数据到本地,定时通过邮件发送。

每天都要手动从Oracle数据库导数据出来,然后通过邮件发送给别人。最后通过一些办法,让这个过程自动化。

第一步.通过utl_file 包从数据库导数据到本地服务器

通过存储过程实现

CREATE OR REPLACE PROCEDURE DATA_TO_CSV
IS    
      FILE_NAME UTL_FILE.FILE_TYPE;
      FILE_NAME VARCHAR(200);
      FIN_NAME  VARCHAR(500);
          BEGIN
           EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD''';
           SELECT SYSDATE INTO FILE_NAME FROM DUAL;
           FIN_NAME:=FILE_NAME||'.CSV';          
            FILE_NAME := UTL_FILE.FOPEN('DIR2',FIN_NAME,'W',1000);
            FOR I IN (SELECT T.DEPTNO||','||T.DNAME||','||T.LOC AS RESULT FROM SCOTT.DEPT T) LOOP
            UTL_FILE.PUT_LINE(FILE_NAME,I.RESULT);
            END LOOP;
            UTL_FILE.FFLUSH(FILE_NAME);
            UTL_FILE.FCLOSE(FILE_NAME);
       END;                      
/

第二步:设置job.定时执行这个SP

#设置job每天定时执行SP
#Author Mr.xu
DECLARE  
 JOB NUMBER;  
 BEGIN  
	DBMS_JOB.SUBMIT( job => JOB,
	                  what => 'DATA_TO_CSV;',  
	                  next_date => to_date('31-08-2018 21:52:00','dd-mm-yyyy hh24:mi:ss'),  
	                  interval => 'sysdate+1/86400');
 commit;
 END;  
/ 

#运行job,相关的job号可以在user_jobs中查找.
begin

              dbms_job.run(24);

end;
/

第三步:利用python ftplib模块从远程服务器取数据

#利用Python的ftplib模块取特定的文件
#每天定时执行
# -*- coding: utf-8 -*-
#Author Mr.xu
from ftplib import FTP
import datetime
def connect_ftp():
    host = "192.168.18.101"
    user = "root"
    password = "beijing"
    ftp = FTP()
    ftp.connect(host,21)
    ftp.login(user,password)
    return ftp

def download_file():
    file_name = datetime.date.today().strftime('%Y-%m-%d')
    file_nm = file_name+'.csv'
    remote_dir = ("/home/oracle/utlfile/{}".format(file_nm))
    ftp = connect_ftp()
    local = "E:\\提数脚本\\{}".format(file_nm)
    ft=open(local,'wb')
    bufsize = 1024
    ftp.retrbinary('RETR '  + remote_dir, ft.write, bufsize)
    ft.close()
    ftp.quit()
download_file()

第四步:利用python 发邮件出去.这个脚本是转载别人的。具体地址忘了

#利用python每天发送邮件
#每天定时执行
# -*- coding: utf-8 -*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.multipart import MIMEBase
from email.mime.text import MIMEText
from email.encoders import encode_base64
import email
import os.path
import mimetypes
password = 'rhozdowzzmoaidid'
From = "@qq.com"                               # 发送邮箱
To = "@qq.com"                                  # 接受邮箱
file_name = "E:\\提数脚本\\2018-09-01.csv"               # 附件名(带路径)
server = smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(From, password)                             # 仅smtp服务器需要验证时
#<span><span></span></span>                              # 构造MIMEMultipart对象做为根容器
main_msg = MIMEMultipart()
                                                         # 构造MIMEText对象做为邮件显示内容并附加到根容器
text_msg = MIMEText("我this is a test text to text mime", _charset="utf-8")
main_msg.attach(text_msg)
data = open(file_name, 'rb')
ctype, encoding = mimetypes.guess_type(file_name)
if ctype is None or encoding is not None:
    ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
file_msg = MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close()
encode_base64(file_msg)  # 把附件编码
## 设置附件头
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition', 'attachment', filename=basename)  # 修改邮件头
main_msg.attach(file_msg)
# 设置根容器属性
main_msg['From'] = From
main_msg['To'] = To
main_msg['Subject'] = "attach test "
main_msg['Date'] = email.utils.formatdate()
# 得到格式化后的完整文本
fullText = main_msg.as_string()
print ('df')
# 用smtp发送邮件
try:
    server.sendmail(From, To, fullText)
finally:
    server.quit()

第五步:建立windows的任务计划自动执行这两个脚本.建立两个批处理脚本

python 每日提数.py

python 发送邮件.py

设置定时任务注意的地方,在触发器的地方设置时间.然后保存就可以了。

 

猜你喜欢

转载自blog.csdn.net/lv941002/article/details/82289905