一段通用的錯誤處理的例子(把錯誤寫到了的自己建立的記錄錯誤的日志表里面):
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);

解决方案 »

  1.   


      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
      

  2.   


          commit;
    --错误处理
          EXCEPTION
          WHEN DUP_VAL_ON_INDEX THEN 
    --插入日志
              insert into aaaa(aaaa,bbbb) values ('ss','ss01');提示:
    出现符号“excaption”需要其中之一 begin、declare、end 、for、goto
              
      

  3.   

    寫錯了,是exception,not excaption
      

  4.   

    少一个END;
    错误处理
        BEGIN
         。  
        EXCEPTION
          WHEN DUP_VAL_ON_INDEX THEN 
    --插入日志
              insert into aaaa(aaaa,bbbb) values ('ss','ss01');
        END;
    加上这个END就OK了。异常处理的一般格式如:
      
        BEGIN
          .........  
        EXCEPTION
          WHEN OTHERS THEN 
           null;
        END;
      

  5.   

    谢谢各位改进版,如果出现重复是返回到while还是 insert into log
    我怎么一出现错误就插入log 1万多条数据
    真让人受不了  while cur_equlas_openup%found loop
       begin
          insert into zwdjdxg z(z.djbh,z.gxcs,z.workerid,z.ywlbid,z.mid,
            z.dhhm,z.dhkh,z.blrq,z.dbr,z.dbrzjhm,
            z.dbrlxdh,z.dbrzjlxid,z.removetag,z.destroytime,z.tradetypecode,z.deptid,
            z.khmc,z.zjlxid,z.zjhm,z.txdz,z.yzbm,z.lxdh1,z.lxr,
            z.tclxid) values(
              bcustomerid,'99','8888','WXGH','SH002',
              bmphonecode,bsimcardno,bopendate,bassurename,bassurepid,
              bassurelink,bassuretypecode,bremovetag,bdestroytime,btradetypecode,bdepartid,
              ausrname,apassporttypecode,ausrpid,ausraddress,apostcode,alinkhomephone,alinkman,
              cfeesetcode
            );
          commit;
       EXCEPTION
           WHEN OTHERS THEN
       begin
        -- 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 l (l.workerid,l.czrq,l.funcid,l.actor,l.operate)
          VALUES ('8888',sysdate,v_ErrorCode||'导入数据','导入数据',bcustomerid||'v_ErrorMsg');
        commit;
       end; 
      
    end;
      end loop;
      

  6.   

    如果出现重复是返回到while还是 insert into log
    我怎么一出现错误就插入log 1万多条数据你的异常处理都没有做什么动作,除了INSERT,没有RETURN或goto之类的
    语句,肯定是报错了INSERT然后返回循环
      

  7.   

    1。如果你的目标表有唯一索引,在insert第一条后,发现又有一条是重复的,就应该走到异常,insert到你的错误表后,在进行判断,接着循环。2。异常处理的时候,我觉得没有必要在用一个begin,end块。只要有插入异常表的insert语句就够了吧。块多了会影响效率。
    begin
    EXCEPTION
    --begin(这个begin块我觉得没有必要)
           WHEN OTHERS THEN
           ....插入你的异常表
    --end(这个begin块我觉得没有必要)
    end;
    3。你的意思是不是同一个记录在异常表中插入很多次?我怀疑你的过程没有循环出来。
    看你的过程,因为你用的是fetch,用了%found loop,在过程的end loop前却没有取第二条数据的语句,即缺少fetch语句。另外,好像cursor用过了没有关闭啊。close cursor。我能看到的就这么多,楼主看看吧。:)