【问题标题】:Finding the job number in an exception handler在异常处理程序中查找作业编号
【发布时间】:2012-02-02 04:59:06
【问题描述】:

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

【问题讨论】:

  • 您的意思是 PID/SID?还是你在使用 dbms_job?

标签: oracle exception-handling plsql oracle11g jobs


【解决方案1】:

在搜索时,我在 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;

【讨论】:

    【解决方案2】:

    如果您在谈论 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】:

      以您建议的解决方案为基础。

      我会将 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

      【讨论】:

        【解决方案4】:

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

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

        希望有帮助

        【讨论】:

          猜你喜欢
          • 2014-08-07
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          • 2019-08-12
          • 2011-09-25
          • 1970-01-01
          • 1970-01-01
          • 2021-04-16
          相关资源
          最近更新 更多