令我们失望的是,我们发现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
异常。问题是:有没有办法让工作失败而不必改变程序的代码?
答案 0 :(得分:2)
这似乎是x
的已知问题:例如:
要解决此问题,您可以将作业类型更改为y
。以下是我创建工作时所发生的情况,检查其状态,给它一秒左右的时间在后台运行并再次检查:
DBMS_SCHEDULER