2012-01-04 50 views
3

我有一些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

你指的是PID/SID?或者你使用dbms_job? – tbone 2012-01-04 12:31:42

回答

2

在寻找,我在OraFAQs论坛突出sys_context功能BG_JOB_ID参数发现this post - 试试看。

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; 
+0

谢谢!这给了我工作号码,并完美地工作。 – 2012-01-05 18:49:24

+0

干杯@SamM! – Sathya 2012-01-06 02:56:28

0

如果你想会话信息(例如会话ID,或任何其他会话信息),那么你可以尝试(选择你希望报告列/日志):

select * from v$session where sid=(select sys_context('USERENV','SID') from dual); 

希望帮助

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

1

如果你在谈论的dbms_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; 
/