在异常处理程序中查找作业号

时间:2012-01-04 09:11:50

标签: oracle exception-handling plsql oracle11g jobs

我正在运行一些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;

4 个答案:

答案 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);

希望有所帮助