始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

Linux下Oracle查询结果以html格式定期发送邮件

发布时间:  2012/9/24 16:49:59

任务: 每天早上8:00将Oracle查询语句的内容变成html的形式,制作一脚本,在指定时间用mutt自动发送到邮箱

版本: Linux version 2.6.18-194.el5

Oracle Release 10.2.0.5.0-
 


使用工具:shell 脚本

mutt 邮件代理

sendmail

crontab 自动任务处理

 

一 shell脚本(生成html文件,mutt发送)

1 生成html文件

利用行列转换的sql语句,将sys用户下的tb表(表-1)形式转化为表-2,并生成html1.html文件

表-1

NAME       COURSE          SCORE
---------- ---------- ----------
chen       chinese            74
chen       math                 99
chen       physics            88
ck          chinese            78
ck          math                 89
ck          physics            98

表-2
NAME                     chinese              math         physics            totle                avg
---------- ---------- ---------- ---------- ---------- ----------
chen                              74                  99                 88                261                  87
ck                                 78                  89                 98                265              88.33


使用的select语句(行列转换)

select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",sum(score) "totle",round(avg(score),2) "avg" from tb group by name;

 

 

生成html文件

#设置生成表格式


set pagesize 0

set term off

set feedback off

set linesize 1000

set trimspool on

set term off verify off feedback off pagesize 999     


#开启生成html文件


set markup html on entmap on spool on head "<TITLE>Grade of Students</title> <!--body {backgroud:ffffc6} --></style>"

set echo off

spool /home/Oracle/html1.html replace

select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",su m(score) totle,round(avg(score),2) avg from tb group by name;

spool off

set markup html off

set echo on


2 使用mutt发送

echo cklovely@vip.qq.com > /tmp/user.txt --需要发送的邮件

echo “test”|mutt -s “subject name” -a /home/Oracle/html1.html `cat /tmp/user.txt`

 


说明:-s 邮件的题目 -a 添加附件 最后是添加发送的邮箱地址

 


注意:此处默认发件箱是本机 root@localhost.localdomain,而值得一提的是,必须要在sendmail运行的行况下才可以发送

  a   关于sendmail启动缓慢的问题

    这是个比较常见的问题,出现这个问题的根本原因是主机名没有分配好

解决办法:

    我们可以修改系统配置文件/etc/hosts 和/etc/resolv.conf

    让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名

        修改/etc/hosts ,未修改之前

     127.0.0.1 localhost.localdomain localhost

        修改成

     127.0.0.1 localhost.localdomain localhost cklovely

 


  b    如果不需要从 root@localhost.localdomain 中发送邮件,可以选择从哪个邮箱发送,在/etc/Muttrc中添加一行

     my_hdr from: ckQyanqi@126.com

 


3 完成html.sh脚本

cat /home/Oracle/html.sh

#!/bin/bash

source ~Oracle/.bash_profile

$Oracle_HOME/bin/sqlplus -s "/ as sysdba" <<E

set pagesize 0

set term off

set feedback off

set linesize 1000

set trimspool on

set term off verify off feedback off pagesize 999

set markup html on entmap on spool on head "<TITLE>Grade of Students</title> <!--body {backgroud:ffffc6} --></style>"

set echo off

spool /home/Oracle/html1.html replace

select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",sum(score) totle,round(avg(score),2) avg from tb group by name;

spool off

set markup html off

set echo on

E

echo cklovely@vip.qq.com > /tmp/user.txt

echo "test"|mutt -s "Grade of Students" -a /home/Oracle/html1.html `cat /tmp/user.txt`

 


   二   系统自动按时发送

    定义时间让系统自动运行脚本的方法很多

    而在linux系统中经常使用的要数crontab了。

    (其他的方法有:Oracle中的dbms_jobs,还有就是dbms_scheduler)

    /etc/cron.deny:
       將不可以使用 crontab 的帳號寫入其中,若未記錄到這個檔案當中的使用者,就可以使用 crontab 。

 


    运行crontab有2种方法:

   1 直接用crontab命令

    當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裡面去了,而且是以帳號來作為判別的。另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中,所以囉,如果你的 Linux 不知道有否被植入木馬時,也可以搜尋一下 /var/log/cron 這個登錄檔呢!

    Crontab语法:

     crontab [-u username] [-l|-e|-r]

     croutab -e (默认username为root)打开/var/spool/cron/root 编辑

     croutab -l (默认 username 为root)查看root用户下的自动任务

     croutab -r (默认 username 为root)删除root下所有的自动任务

    编辑内容:

       * * * * * command

 


代表意義 分鐘 小時 日期 月份 週 指令
數字範圍 0-59 0-23 1-31 1-12 0-7 命令或脚本


特殊字符 代表意義
*(星號) 代表任何時刻都接受的意思!舉例來說,範例一內那個日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思!
,(逗號) 代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是:
0 3,6 * * * command
時間參數還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用!
-(減號) 代表一段時間範圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作:
20 8-12 * * * command
仔細看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思!
/n(斜線) 那個 n 代表數字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進行一次,則:

*/5 * * * * command
很簡單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思!

   2 系统设定文件:/etc/crontab 必须是root用户设定

  * MAILTO=root:
這個項目是說,當 /etc/crontab 這個檔案中的例行性工作的指令發生錯誤時,或者是該工作的執行結果有 STDOUT/STDERR 時,會將錯誤訊息或者是螢幕顯示的訊息傳給誰

    例如 MAILTO=cklovely@vip.qq.com

  * PATH=....

    这里就是输入执行命令的搜索路径,使用预设定路径已经足够了

  * 01 * * * * root run-parts /etc/cron.hourly;

    注意:但是在五个时间后面接的並不是指令,而是一個新的位置,那就是『執行後面那串指令的身份』,這與使用者的 crontab -e 不相同

 


    基本上, cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容 』,因此,只要你編輯完 /etc/crontab 這個檔案,並且將他儲存之後,那麼 cron 的設定就自動的會來執行了!

    当然,也可以用service crond restart

 


 例如本例

方法一:

    crontab -e

    00 08 * * * su – Oracle -c “/home/oracle/html.sh”

方法二:

    vi /etc /crontab

    00 08 * * * root su – Oracle -c “/home/oracle/html.sh”

或者

    00 08 * * * Oracle /home/oracle/html.sh


 


本文出自:亿恩科技【www.enkj.com】

服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线