create or replace procedure sp_job_check as
v_counter number;
v_html varchar2(30000);
begin
select max(failures) into v_counter from dba_jobs;
if v_counter>0 then
v_html:='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" xmlns="http://www.w3.org/1999/xhtml">';
v_html:=v_html||'<head><meta http-equiv=Content-Type content=text/html;charset=gb2312></head>';
v_html:=v_html||'<body>';
v_html:=v_html||'<table style="border-collapse:collapse">';
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >job</td><td style="border:1px solid black" >SCHEMA_USER</td><td style="border:1px solid black" >LAST_DATE</td><td style="border:1px solid black" >FAILURES</td><td style="border:1px solid black" >BROKEN</td><td style="border:1px solid black" >INTERVAL</td><td style="border:1px solid black" >WHAT</td>';
v_html:=v_html||'</tr>';
for mm in ( select job,SCHEMA_USER,to_char(LAST_DATE,'yyyy-mm-dd hh24:mi:ss') last_time,WHAT,INTERVAL,FAILURES,BROKEN from dba_jobs where failures>0) loop
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >'||mm.job||'</td><td style="border:1px solid black" >'||mm.SCHEMA_USER||'</td><td style="border:1px solid black" >'||mm.last_time||'</td><td style="border:1px solid black" >'||mm.FAILURES||'</td><td style="border:1px solid black" >'||mm.BROKEN||'</td><td style="border:1px solid black" >'||mm.INTERVAL||'</td><td style="border:1px solid black" >'||mm.WHAT||'</td>';
v_html:=v_html||'</tr>';
end loop;
v_html:=v_html||'</table>';
v_html:=v_html||'</body>';
v_html:=v_html||'</html>';
begin
SEND_EMAIL ('mdssysmail@mic.com.tw'
,'luxus.liao@mic.com.tw;woody.wu@mic.com.tw'
,'Job Check Failures>0 from MDSDB'
,v_html
,'eagle.zhou@mic.com.tw'
,'luxus.liao@mic.com.tw'
, 'text/html;charset=gb2312'
, '10.98.0.165'
, 25);
end;
end if;
exception when others then
dbms_output.put_line(sqlcode);
rollback;
end;
心得:
1.一开始想在begin后输入for vv in ( select failures from dba_jobs) loop 再if vv.failures>0,发现这样不行,因为一个循环里面再出现另一个循环如下,发现发邮件的SEND_EMAIL不知道放在什么位置,因为SEND_EMAIL只能放在最后一个循环里面
for mm in ( select job,SCHEMA_USER,to_char(LAST_DATE,'yyyy-mm-dd hh24:mi:ss') last_time,WHAT,INTERVAL,FAILURES,BROKEN from dba_jobs where failures>0) loop
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >'||mm.job||'</td><td style="border:1px solid black" >'||mm.SCHEMA_USER||'</td><td style="border:1px solid black" >'||mm.last_time||'</td><td style="border:1px solid black" >'||mm.FAILURES||'</td><td style="border:1px solid black" >'||mm.BROKEN||'</td><td style="border:1px solid black" >'||mm.INTERVAL||'</td><td style="border:1px solid black" >'||mm.WHAT||'</td>';
v_html:=v_html||'</tr>';
end loop;
2.如果把SEND_EMAIL放在第一个循环里面,则第一个循环有多少次,则发送多少次邮件
3.如果把SEND_EMAIL放在第一个循环里面的第二个循环,则邮件发送的内容是第一个循环的最后一次的第二个循环里面的所有次数,相当于第一个循环没有意义,取的是第一个循环的最后一次
4.如果只有第一个循环,没有第二个循环,且SEND_EMAIL放在第一个循环里面,则第一个循环有多少次,则发送多少次邮件,且邮件内容只有表格标题和每次循环的一行表格内容,即结果不会出现一行表格标题和多行表格内容
v_counter number;
v_html varchar2(30000);
begin
select max(failures) into v_counter from dba_jobs;
if v_counter>0 then
v_html:='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" xmlns="http://www.w3.org/1999/xhtml">';
v_html:=v_html||'<head><meta http-equiv=Content-Type content=text/html;charset=gb2312></head>';
v_html:=v_html||'<body>';
v_html:=v_html||'<table style="border-collapse:collapse">';
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >job</td><td style="border:1px solid black" >SCHEMA_USER</td><td style="border:1px solid black" >LAST_DATE</td><td style="border:1px solid black" >FAILURES</td><td style="border:1px solid black" >BROKEN</td><td style="border:1px solid black" >INTERVAL</td><td style="border:1px solid black" >WHAT</td>';
v_html:=v_html||'</tr>';
for mm in ( select job,SCHEMA_USER,to_char(LAST_DATE,'yyyy-mm-dd hh24:mi:ss') last_time,WHAT,INTERVAL,FAILURES,BROKEN from dba_jobs where failures>0) loop
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >'||mm.job||'</td><td style="border:1px solid black" >'||mm.SCHEMA_USER||'</td><td style="border:1px solid black" >'||mm.last_time||'</td><td style="border:1px solid black" >'||mm.FAILURES||'</td><td style="border:1px solid black" >'||mm.BROKEN||'</td><td style="border:1px solid black" >'||mm.INTERVAL||'</td><td style="border:1px solid black" >'||mm.WHAT||'</td>';
v_html:=v_html||'</tr>';
end loop;
v_html:=v_html||'</table>';
v_html:=v_html||'</body>';
v_html:=v_html||'</html>';
begin
SEND_EMAIL ('mdssysmail@mic.com.tw'
,'luxus.liao@mic.com.tw;woody.wu@mic.com.tw'
,'Job Check Failures>0 from MDSDB'
,v_html
,'eagle.zhou@mic.com.tw'
,'luxus.liao@mic.com.tw'
, 'text/html;charset=gb2312'
, '10.98.0.165'
, 25);
end;
end if;
exception when others then
dbms_output.put_line(sqlcode);
rollback;
end;
心得:
1.一开始想在begin后输入for vv in ( select failures from dba_jobs) loop 再if vv.failures>0,发现这样不行,因为一个循环里面再出现另一个循环如下,发现发邮件的SEND_EMAIL不知道放在什么位置,因为SEND_EMAIL只能放在最后一个循环里面
for mm in ( select job,SCHEMA_USER,to_char(LAST_DATE,'yyyy-mm-dd hh24:mi:ss') last_time,WHAT,INTERVAL,FAILURES,BROKEN from dba_jobs where failures>0) loop
v_html:=v_html||'<tr>';
v_html:=v_html||'<td style="border:1px solid black" >'||mm.job||'</td><td style="border:1px solid black" >'||mm.SCHEMA_USER||'</td><td style="border:1px solid black" >'||mm.last_time||'</td><td style="border:1px solid black" >'||mm.FAILURES||'</td><td style="border:1px solid black" >'||mm.BROKEN||'</td><td style="border:1px solid black" >'||mm.INTERVAL||'</td><td style="border:1px solid black" >'||mm.WHAT||'</td>';
v_html:=v_html||'</tr>';
end loop;
2.如果把SEND_EMAIL放在第一个循环里面,则第一个循环有多少次,则发送多少次邮件
3.如果把SEND_EMAIL放在第一个循环里面的第二个循环,则邮件发送的内容是第一个循环的最后一次的第二个循环里面的所有次数,相当于第一个循环没有意义,取的是第一个循环的最后一次
4.如果只有第一个循环,没有第二个循环,且SEND_EMAIL放在第一个循环里面,则第一个循环有多少次,则发送多少次邮件,且邮件内容只有表格标题和每次循环的一行表格内容,即结果不会出现一行表格标题和多行表格内容
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2139887/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30126024/viewspace-2139887/