如何编写块以跳过失败过程

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 runp2 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

这样,如果任何程序遇到异常,其他程序仍会执行。但是,这些块之间的任何异常都将绕过以下任何过程调用块以及过程块之间的任何其他代码。在整个匿名块中没有“块之间”代码。

【讨论】:

请查看我从您的解决方案中得到的答案。我仍然没有得到预期的答案。

以上是关于如何编写块以跳过失败过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中转义完成块以返回正常的应用程序流程?

程序人生:如果没有失败,怎么能知道自己真正的期待和愿望

如何编写存储过程

如何配置 Maven 安装以跳过 Eclipse 中的测试?

如何设置键盘快捷键以跳转到行首/行尾? [关闭]

MySQL - 如何在过程中编写查询? (SET 数据类型参数)