oracle – PL / SQL异常处理:do nothing(忽略异常)

前端之家收集整理的这篇文章主要介绍了oracle – PL / SQL异常处理:do nothing(忽略异常)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个我经常被问到的问题.由于我在stackoverflow上找不到任何确切的重复,我以为我会把它作为参考.

题:
在PL / sql中,我知道捕获异常并执行代码,以及如何将它们传播到调用块.
例如,在以下过程中,NO_DATA_FOUND异常被直接处理,而所有其他异常都被调用调用块:

  1. CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
  2. IS
  3. BEGIN
  4. do_stuff();
  5.  
  6. EXCEPTION
  7. WHEN NO_DATA_FOUND THEN
  8. -- Do something
  9. handle_exception();
  10.  
  11. WHEN OTHERS THEN
  12. -- Propagate exception
  13. RAISE;
  14. END;

但是我应该使用什么命令来忽略一个或所有引发的异常并将执行控制返回到调用块?

虽然我同意99%的时间是不好的做法,默默地忽略异常,而不是至少将它们记录在某个地方,但是具体情况是完全可以接受的.

在这些情况下,NULL是你的朋友:

  1. [...]
  2. EXCEPTION
  3.  
  4. WHEN OTHERS THEN
  5. NULL;
  6. END;

忽略例外可能需要的两种典型情况是:

1)您的代码包含一个您知道的语句可能会偶尔失败,您不希望此事件中断您的程序流程.
在这种情况下,您应该将嵌套的语句包含在嵌套块中,如下例所示:

  1. CREATE OR REPLACE PROCEDURE MY_PROCEDURE()
  2. IS
  3. l_empoyee_name EMPLOYEES.EMPLOYEE_NAME%TYPE;
  4. BEGIN
  5. -- Catch potential NO_DATA_FOUND exception and continue
  6. BEGIN
  7. SELECT EMPLOYEE_NAME
  8. INTO l_empoyee_name
  9. FROM EMPLOYEES
  10. WHERE EMPLOYEE_ID = 12345;
  11. EXCEPTION
  12. WHEN NO_DATA_FOUND THEN
  13. NULL;
  14. WHEN OTHERS THEN
  15. RAISE;
  16. END;
  17.  
  18. do_stuff();
  19.  
  20. EXCEPTION
  21.  
  22. WHEN OTHERS THEN
  23. -- Propagate exception
  24. RAISE;
  25. END;

请注意,PL / sql通常不允许从Visual Basic知道的“错误恢复继续”类型的异常处理,其中所有异常都被忽略,并且程序继续运行,就好像没有发生任何事情一样(参见On error resume next type of error handling in PL/SQL oracle).您需要在嵌套块中明确地包含潜在的失败语句.

2)你的程序是不重要的,忽略它抛出的所有异常不会影响你的主程序逻辑. (但是,这种情况很少,经常会导致长期的调试噩梦)

  1. BEGIN
  2.  
  3. do_stuff();
  4.  
  5. EXCEPTION
  6.  
  7. WHEN OTHERS THEN
  8. -- Ignore all exceptions and return control to calling block
  9. NULL;
  10. END;

猜你在找的Oracle相关文章