如何编写块以跳过失败过程
Posted
技术标签:
【中文标题】如何编写块以跳过失败过程【英文标题】:How to write block to skip failure procedure 【发布时间】:2019-12-21 17:57:29 【问题描述】:我有以下三个程序
CREATE OR REPLACE PROCEDURE p1(p_a IN NUMBER)
AS
BEGIN
dbms_output.put_line(p_a || 'is a number');
END;
/
CREATE OR REPLACE PROCEDURE p2(p_b IN VARCHAR2)
AS
BEGIN
dbms_output.put_line(p_b || 'is a word');
END;
/
CREATE OR REPLACE PROCEDURE p3(p_c IN DATE)
AS
BEGIN
dbms_output.put_line(p_c || 'is a date');
END;
/
上述过程在逻辑上没有关联,但我想写一个匿名块,其中过程 p1 运行成功,过程 p2 有一些错误意味着过程 p3 将无法正常运行。但是我想写一个匿名块,即使过程 p2 失败,它也会使过程 p3 运行。
如何写anonymous block
?
我们可以去DBMS_SCHEDULER
吗?
【问题讨论】:
异常块 @LukaszSzozda 我想用匿名块写。 匿名块也可以有 EXECPTION 块。这就是重点 我知道有异常块的过程方法会处理错误。但我想要一个匿名块,例如p1 fails p2 and p3 have to run
或 p2 fails p1 and p3 should run
或明智的反之亦然
不会有问题吧?只需用匿名块包装每个 SP 调用,但有异常?如果失败,它不会使主要匿名块失败并继续运行
【参考方案1】:
@dmak2709 发布的那个块会产生你想要的结果。 p1、p2 或 p3 中的异常不会影响其他的执行。但是您也可以在整个匿名块中处理这些异常。匿名块不仅可以有异常部分,其中的任何块也可以。所以你可以在它自己的嵌套块中包含对每个过程的调用。
begin -- overall anonymous block
begin -- inner block for p1
p1(1)
exception
when others
then dbms_out.put_line('Error within p1');
end ; -- inner block for p1
begin -- inner block for p2
p2('Hello World');
exception
when others
then dbms_out.put_line('Error within p2');
end ; -- inner block for p2
begin -- inner block for p3
p3(sysdate)
exception
when others
then dbms_out.put_line('Error within p3');
end ; -- inner block for p3
exception -- exception for overall anonymous block
when others
then dbms_out.put_line('Error within overall anonymous block');
end ; -- overall anonymous block
这样,如果任何程序遇到异常,其他程序仍会执行。但是,这些块之间的任何异常都将绕过以下任何过程调用块以及过程块之间的任何其他代码。在整个匿名块中没有“块之间”代码。
【讨论】:
请查看我从您的解决方案中得到的答案。我仍然没有得到预期的答案。以上是关于如何编写块以跳过失败过程的主要内容,如果未能解决你的问题,请参考以下文章