我正在运行一些Oracle作业。在每个作业中,我设置了一个PL / SQL异常处理程序,如果作业运行的代码中遇到错误,该处理程序会向开发人员发送电子邮件。有没有办法让我在异常处理程序中知道作业号,以便我可以在电子邮件中包含它?
类似的东西:
BEGIN
Run_This_Plsql();
EXCEPTION WHEN OTHERS DO
DECLARE
job_number VARCHAR2(64);
BEGIN
job_number := --This would be the job number of the currently running job
Send_email(job_number, subject, recipient, from);
END;
END;
答案 0 :(得分:2)
在搜索时,我在OraFAQs论坛中发现this post突出显示sys_context函数的BG_JOB_ID
参数 - 试一试。
BEGIN
Run_This_Plsql();
EXCEPTION WHEN OTHERS DO
DECLARE
job_number VARCHAR2(64);
BEGIN
job_number := sys_context('userenv', 'BG_JOB_ID');
Send_email(job_number, subject, recipient, from);
END;
END;
答案 1 :(得分:1)
以你建议的解决方案为基础。
我会将oracle作业号存储在表中,并在进程启动时读取此编号 然后,您可以创建与作业编号相关的日志记录,状态,电子邮件详细信息表。
这里有一些伪代码:
BEGIN
SELECT oracle_job_no INTO v_job_no FROM Myjobs WHERE jobName='Daily doodah';
job_start(v_job_no); -- log job start
Run_This_Plsql(v_job_no);
job_end(v_job_no); -- log job end
EXCEPTION WHEN OTHERS DO
DECLARE
BEGIN
Job_fail(v_job_no); -- log job failure, send email, etc
END;
END;
或者只是使用现成的调度系统来完成所有这些以及更多例如autosys
答案 2 :(得分:1)
如果您正在谈论dbms_job,那么您只需使用 job 参数即可。假设你有以下程序
procedure do_the_job(p_job_no in number) is
begin
...
exception
when others then
send_email(p_job_no, ...);
end;
然后你可以将工作号传递给这样的程序:
declare
l_job_no number;
begin
dbms_job.submit(job => l_job_no, what => 'do_the_job(job);');
end;
/
答案 3 :(得分:0)
如果您想要会话信息(例如会话ID或任何其他会话信息),那么您可以尝试(选择要报告/记录的列):
select * from v$session where sid=(select sys_context('USERENV','SID') from dual);
希望有所帮助