我编写了一个程序,将使用Oracle调度程序进行调度,并尝试使用以下异常块处理异常:
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '
|| SQLCODE || ' -ERROR- ' || SQLERRM);
END;
我还想确保我是否使用上述支持团队或DBA在遇到任何异常的情况下了解并且他们可以采取适当的措施以及所有交易都应该回滚。
答案 0 :(得分:0)
如果异常阻止的唯一原因是通知支持团队 - 不要这样做,因为它完全是多余的。
Oracle在视图XX_SCHEDULER_JOB_RUNS
/ XX_SCHEDULER_JOB_RUN_DETAILS
中记录每个作业的结果,其中XX是DBA
/ ALL
/ USER
之一(用户)包含当前登录用户的所有运行,All包含允许当前登录用户查看的所有运行,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';
返回:
LOG_DATE JOB_NAME STATUS ERROR#
20.11.15 12:35:53,516000 +01:00 JOB_RAISE_DEMO FAILED 20001