Oracle no_data_found异常不会传播到调度程序中

时间:2018-01-20 11:46:43

标签: oracle exception scheduler

令我们失望的是,我们发现no_data_found例外不会传播到Oracle调度程序中。

如果您的过程执行select x into my_var并且选择失败并显示no_data_found,则过程将失败,但运行此过程的调度程序仍将成功,链和作业也将成功。

我想知道no_data_found是否是唯一受此影响的例外,或者是否有其他例外?

此外,到目前为止我们提出的唯一解决方案是在过程本身内捕获no_data_found并改为引发用户定义的异常。它确实有效,但这意味着如果我们想要对代码进行故障保护,我们必须进入每个过程并引入此异常处理块。

您能想到一个不涉及代码更改的解决方案吗?也许是数据库级别的设置?

请参阅以下代码

--------------过程

create procedure test as
 l_var number;
 begin
   select 0 
     into l_var 
     from dual 
    where 1 = 0; 
 end;
 /

--------------程序

BEGIN
  dbms_scheduler.create_program (
    program_name   => 'PRG_TEST',
    program_type   => 'STORED_PROCEDURE',
    program_action => 'TEST',
    enabled        => TRUE,
  );
END;
/

-----------------工作

BEGIN
 dbms_scheduler.create_job (
   job_name             => 'JOB_TEST',
   program_name         => 'PRG_TEST',
   enabled              =>  TRUE,
  );
END;
/

我们正在将程序包装到一个程序中,而程序又包含在一个工作中。因为我们启用了这项工作,它将立即运行,并取得成功。

但是,如果我们只是执行这样的程序:

begin
   test;
end;

它会(正确地)失败 - 出现no_data_found异常。问题是:有没有办法让工作失败而不必改变程序的代码?

1 个答案:

答案 0 :(得分:2)

这似乎是x的已知问题:例如:

要解决此问题,您可以将作业类型更改为y。以下是我创建工作时所发生的情况,检查其状态,给它一秒左右的时间在后台运行并再次检查:

DBMS_SCHEDULER