即使在 PL/SQL 中发生异常,也继续循环读取 excel 行

Posted

技术标签:

【中文标题】即使在 PL/SQL 中发生异常,也继续循环读取 excel 行【英文标题】:Continue loop in reading excel rows even when an exception occurred in PL/SQL 【发布时间】:2014-08-22 08:56:01 【问题描述】:

以下是代码概览:

PROCEDURE

BEGIN
  WHILE LOOP --loop each row
    --Read each row and add in table
    COMMIT;
  END LOOP;
EXCEPTION
  WHEN OTHERS
    --log error
    ROLLBACK;
END;

例如:有 5 行。第 3 行有错误。程序在读取错误行后立即停止,使其旁边的其他行不被评估/读取。我的目标是在它出现异常后,它将输出该行并继续读取其他行。那么如果出现异常,我该如何返回循环呢?

【问题讨论】:

将你的这些行放在一个单独的 begin end 块中,并使用它自己的异常处理程序 (begin exception end)。您没有解释您是如何准确读取这些 Excel 行的,但通常带有 log errors(10gR2 及更高版本) 子句的 insert into .. select 语句就足够了,除非您执行一些在纯 SQL 中无法完成的复杂转换。 【参考方案1】:

试试这个,然后你将只在内部匿名块中缓存错误:

PROCEDURE

BEGIN
  WHILE LOOP --loop each row
    BEGIN
      --Read each row and add in table
      COMMIT;
    EXCEPTION
      WHEN OTHERS
        --log error
        ROLLBACK;
    END;
  END LOOP;

END;

【讨论】:

【参考方案2】:

尝试在循环本身中使用独立的 PL/SQL 块。

BEGIN
      WHILE LOOP --loop each row
        BEGIN
        --Read each row and add in table
        COMMIT;
            EXCEPTION --Catch the exception here and print the data and it will move on
        END;
      END LOOP;
    EXCEPTION
      WHEN OTHERS
        --log error
        ROLLBACK;
    END;

【讨论】:

没有任何文本,这样的答案会出现在低质量审核队列中。这意味着您的答案有被删除的风险。我对这个主题一无所知,所以我无法确定它是否质量低下,但我建议您添加一小段内容,说明与您的代码和 OP 帖子的不同之处。最好解释一下为什么这个有效而另一个无效。 感谢您指出这一点,堆栈溢出也问我这个问题。但这对相关观众来说是非常不言自明的。无论如何,考虑到这里的人的质量,我不确定在不看答案质量的情况下,缺少的答案是否值得投反对票。但事不宜迟,我将对此进行编辑。

以上是关于即使在 PL/SQL 中发生异常,也继续循环读取 excel 行的主要内容,如果未能解决你的问题,请参考以下文章

继续执行异常

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

ORACLE PL/SQL编程总结

PL/SQL 在 for 循环中执行即时异常处理

PL/SQL 异常不会引发

循环中的 PL/SQL 异常