Linux下Oracle查询结果以html格式定期发送邮件
任务: 每天早上8:00将oracle查询语句的内容变成html的形式,制作一脚本,在指定时间用mutt自动发送到邮箱版本: Linux version
任务: 每天早上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 "
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"
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 "
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 都適用的意思!
上一篇: SQL Server 2008中不推荐及不支持的功能
下一篇: mysql计算时间差函数_MySQL