令我们沮丧的是,我们发现
no_data_found
异常不会传播到Oracle调度程序中。
如果你有这样的程序
select x into my_var
选择失败
找不到\u data\u
,过程将失败,但运行此过程的调度程序仍将成功,链和作业也将成功。
我想知道
找不到\u data\u
唯一的例外是否会以这种方式受到影响,或者是否还有其他例外?
此外,到目前为止,我们提出的唯一解决方案是捕获过程本身中未找到的\u data\u,并引发用户定义的异常。它确实可以工作,但这意味着如果我们想对代码进行故障证明,我们必须进入每个过程并引入这个异常处理块。
您能想出一个不涉及代码更改的解决方案吗?可能是数据库级别的设置?
请参见下面的代码
--------------程序
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;
它将(正确地)失败-使用
找不到\u data\u
例外问题是:有没有一种方法可以在不更改过程代码的情况下使作业失败?