引发异常后 PL/SQL 继续

Posted

技术标签:

【中文标题】引发异常后 PL/SQL 继续【英文标题】:PL/SQL Continue after exception raised 【发布时间】:2019-12-16 08:01:24 【问题描述】:

我有一个带有异常处理的简单触发器。我的问题是当用户收到错误消息时如何继续应用程序。

  CREATE OR REPLACE TRIGGER "AR_CHECK"
BEFORE INSERT  ON TABLE
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 

DECLARE

v_check number;

cursor c_ar_check is
select ar_no 
from name_view 
where name_id = :new.bill_to_name_id 
and name_type in ('TRAVEL_AGENT','COMPANY');

begin

open c_ar_check;
fetch c_ar_check into v_check;
close c_ar_check;

if v_check is null then
   raise_application_error(-20101, 'ERROR - NUMBER MISSING');
end if;


end;

使用上面的代码,我收到了错误消息,但用户无法继续下一步。 是否有可能获得有关 NULL 值的用户警告但有可能继续?

【问题讨论】:

在触发器的范围内@Littlefoot 是绝对正确的。您的插入代码应拦截错误并通知用户,然后继续。更好的方法根本没有触发器;从您的表创建一个 FK 到 name_view(或者更确切地说是实际的基础表)。然后应用程序拦截 FK 违规并继续进行。 【参考方案1】:

raise_application_error,没有。它将终止执行。

但是,如果您将其替换为其他东西 - 一个微不足道的 dbms_output.put_line 将在测试阶段执行,而某些日志记录过程 - 例如调用(n 个自主事务)过程 - 在生产中可能是更好的选择。

如果您选择dbms_output.put_line,请注意在程序完成之前您不会看到任何消息。

【讨论】:

以上是关于引发异常后 PL/SQL 继续的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 异常不会引发

PL/SQL 异常以啥顺序引发?

PL/SQL 错误处理后继续执行

为啥在匿名 PL/SQL 块中没有立即引发异常?

约束违反异常 PL/SQL

PL SQL 过程不引发异常 no_data_found