Pl Sql 使用 oracle 调度程序调度时过程处理异常

Pl Sql Procedure handle exception while scheduled using oracle scheduler

我已经编写了一个将使用 Oracle 调度程序进行调度的过程,并且正在尝试使用以下异常块来处理异常:

EXCEPTION
   WHEN OTHERS THEN
      raise_application_error(-20001,'An error was encountered - '
      || SQLCODE || ' -ERROR- ' || SQLERRM);
END;

我还想确定如果我使用上面的支持团队或 DBA 来了解任何异常情况,他们可以采取适当的措施,并且所有事务都应该回滚。

如果异常块的唯一原因是通知支持团队 - 不要这样做,因为它完全是多余的。

Oracle 在视图 XX_SCHEDULER_JOB_RUNS / XX_SCHEDULER_JOB_RUN_DETAILS 中记录每个作业 运行 的结果,其中 XX 是 DBA/ALL/[ 之一=17=] (User contains all 运行s for the currently logged-on user, All contains all 运行s the current logined-on user is allowed to see, DBA (需要特殊权限)包含数据库中的所有 运行。

因此,您的支持团队所要做的就是监控 XX_SCHEDULER_JOB_RUN_DETAILS 并检查状态为 FAILURE 的任何条目。

例子

创建一个总是失败的作业,并且 运行 它一次:

begin
  dbms_scheduler.create_job(
      job_name => 'JOB_RAISE_DEMO'
     ,job_type => 'PLSQL_BLOCK'
     ,job_action => 'begin raise_application_error(-20001, ''custom error''); end; '

     ,start_date      => to_timestamp_tz('2015-11-20 13:00:00 Europe/Berlin',
                                         'yyyy-mm-dd hh24:mi:ss tzr')
     ,repeat_interval => null
     ,enabled => TRUE
     ,auto_drop => false);
end;

begin
  dbms_scheduler.run_job('JOB_RAISE_DEMO', use_current_session => false);
end;

然后,查看作业状态:

select log_date, job_name, status, error# 
from user_scheduler_job_run_details 
where job_name = 'JOB_RAISE_DEMO';

这个returns:

LOG_DATE                        JOB_NAME        STATUS  ERROR#
20.11.15 12:35:53,516000 +01:00 JOB_RAISE_DEMO  FAILED  20001