提高程序自检能力  一个好的应用系统不仅要有好的用户界面、齐全的功能处理模块,而且要有很强的错误处理能力。因此要求编程人员要预测可能的各种情况(声明异常情态并引发),并尽可能从错误中恢复过来(编写相应异常情态处理器代码),这就是Oracle8中的异常部分的程序设计内容。然而这部分的设计绝非易事。在异常部分的最后设置OTHERS异常情态处理器是个很好的编程习惯,因为它为运行时刻捕捉到的其它错误指明了处理去向,从而保证了程序的正常运行。格式如下:
  BEGIN
  …
  EXCEPTION
   WHEN excep—name1 THEN
   …
   WHEN excep—name2 THEN
   …
   WHEN OTHERS THEN
   …
  END;
  但是对程序中出现的错误要做到正确的处理(即正确选择异常处理器并执行它),还必须弄清楚异常情态的传播问题。
  异常情态的传播指的是当在程序块的声明、执行、异常部分分别出现异常情态时,或在本块中没有相应的异常处理器时会将这个异常情态传播到哪里,会去激发那个块中的处理器。传播规则是这样的:
  当一个异常情态是在块的执行部分引发的(最常见的),PL/SQL使用下面的规则确定激活哪个异常处理器。(1)若当前块对该异常情态设置了处理器,则执行它并成功完成该块的执行,然后控制转给包含块。(2)若当前块没有该处理器,则通过在包含块中引发它来传播异常情态。然后对包含块执行步骤1。另外,无论是在声明部分引发了一个异常情态,还是在异常处理部分引发,则该异常情态将立即传播给包含块。在包含块引用上述规则进行异常情态的处理,即使在当前块设置了OTHERS处理器也不会被执行。

解决方案 »

  1.   

    insert ...;
       ...
       commit;
       EXCEPTION
          WHEN OTHERS THEN 
              ROLLBACK;
              RAISE;
      

  2.   

    我通常用上面我寫的那個,還有細致一點的:
    EXCEPTION
      WHEN OTHERS THEN
        -- Assign values to the log variables, using built-in
        -- functions.
        v_ErrorCode := SQLCODE;
        v_ErrorMsg := SQLERRM;
        v_CurrentUser := USER;
        v_Information := 'Error encountered on ' ||
          TO_CHAR(SYSDATE) || ' by database user ' || v_CurrentUser;
        -- Insert the log message into log_table.
        INSERT INTO log_table (code, message, info)
          VALUES (v_ErrorCode, v_ErrorMsg, v_Information);
      

  3.   

    說明:
      v_ErrorCode NUMBER;          -- Code for the error
      v_ErrorMsg  VARCHAR2(200);   -- Message text for the error
      v_CurrentUser VARCHAR2(8);   -- Current database user
      v_Information VARCHAR2(100); -- Information about the error
      

  4.   

    begin
      while cur_equlas_openup%found loop
        BEGIN
          insert into aaaa (aaaa,bbbb)values (i,‘aaaa’);
        EXCEPTION
         WHEN OTHERS THEN
           ROLLBACK;
        end loop;
    end;