&LT; <SQL_ERROR>&GT;块</SQL_ERROR>

时间:2009-10-13 15:19:11

标签: oracle plsql

在我们的存储过程中,我们在最后有以下代码。

  <<SQL_ERROR>>
  V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252);

  DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE');

  DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' ||
                       V_SYS_ERROR_MSG);

我们有以下语句调用错误块。

  IF V_SYS_ERROR <> 0 THEN
    GOTO SQL_ERROR;

即使没有错误,DBMS输出语句也会出现。我们怎样才能避免这种情况?

3 个答案:

答案 0 :(得分:2)

你应该避免使用GOTO语句,它们会像你注意到的那样混乱。 PL / SQL带有错误处理,您应该使用EXCEPTION synthax来处理错误:

BEGIN
   <code goes here>
EXCEPTION
   WHEN <exception> THEN
      <deal_with_it>
   WHEN OTHERS THEN
      <log_error>
      RAISE;
END;

答案 1 :(得分:2)

推荐这种GOTO方法:正如其他人已经说过的那样,例外是处理PL / SQL错误的正确方法。但是要解决您的具体问题,您可以这样做:

BEGIN
  IF V_SYS_ERROR <> 0 THEN
    GOTO SQL_ERROR;
  END IF;

  GOTO PROC_END;

  <<SQL_ERROR>>
    V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252);

    DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE');

    DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' ||
                         V_SYS_ERROR_MSG);

  <<PROC_END>>
  NULL;
END;

当然,这仍然涉及更改代码,所以如果你这样做,为什么不正确呢?即。

DECLARE
  SQL_ERROR EXCEPTION;
BEGIN
  IF V_SYS_ERROR <> 0 THEN
    RAISE SQL_ERROR;
  END IF;

EXCEPTION

  WHEN SQL_ERROR THEN
    V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252);

    DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE');

    DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' ||
                         V_SYS_ERROR_MSG);
    RAISE;

END;

顺便说一句,DBMS_OUTPUT.PUT_LINE不适合在生产应用程序系统中输出错误消息。仅在开发期间用于调试。

答案 2 :(得分:1)

我认为如果不使用异常处理程序,您将无法获得所需的结果。从PL / SQL用户指南:

  

没有参数的SQLERRM很有用   仅在异常处理程序中。外   处理程序,没有参数的SQLERRM   总是回归正常,成功   完成消息。

首先,有可能发生错误,但是您看到一条消息说“正常,成功完成”,因为这就是SQLERRM将始终在此上下文中返回的内容。

假设情况并非如此,听起来您只是允许控制从“正常”代码流入“错误处理程序”。如果错误处理程序位于过程的最后,那么一个简单的修复就是在&lt;&gt;之前添加一个RETURN语句。标签

更好的解决方法是将错误处理程序代码移动到单独的过程并调用该过程而不是使用GOTO。