然后主程序是这样写的,请问如何实现Insert 出现错误的时候,业务流水号也能回滚????就是不加一???
CREATE OR REPLACE PROCEDURE CP_DA_INTSTT1(i_vMainSN   VARCHAR2, --工单流水号   bbbbbYYYYMMDDnnnnnn
  i_vBusiness VARCHAR2, --业务编码
  i_vExchange VARCHAR2, --工单区域归属编码
  o_sRetval   OUT SMALLINT) IS
 vMainSN    VARCHAR2(20);
 iError     INTEGER;
 iErrorNo   INTEGER;
 iDebugNum  INTEGER;
 vErrmsg    VARCHAR2(255);
 iDebugFlag INTEGER;BEGIN
 --====获取业务流水号==============================================
 BEGIN
  iError := 0;
  cp_da_Get_MainSN(i_vBusiness, vMainSN, o_sRetVal);
 EXCEPTION
  WHEN OTHERS THEN
   iError := SQLCODE;
 END;  BEGIN
  INSERT INTO da_MainQueue
   (MainSN, --工单流水号   bbbbbYYYYMMDDnnnnnn 
Business, --业务编码
Exchange, --工单区域归属编码
XXX)
  VALUES
   (vMainSN, --工单流水号    
i_vBusiness, --业务编码
i_vExchange,
NULL); --这里会出错.但是业务流水号如何回滚???????
 EXCEPTION
  WHEN NO_DATA_FOUND THEN
   NULL;
  WHEN OTHERS THEN
   iError := SQLCODE;
 END;  IF iError != 0
 THEN
  iErrorNo  := iError;
  vErrMsg   := 'INSERT da_InsertRecord Fail !';
  o_sRetval := 1;
  iDebugNum := 16;
  GOTO ERROR0;
 
 END IF;  GOTO End0;  <<error0>>
 ROLLBACK;
 <<END0>>
 COMMIT;
END CP_DA_INTSTT1;

解决方案 »

  1.   

    一起commit,rollback 不就可以了嘛
      

  2.   

    在一个事务中执行
    一起commit,rollback
      

  3.   

    cp_da_Get_MainSN中流水号家一的事务没有回滚,不知为什么?
      

  4.   

    嗯,既然序列自己产生,它与数据库的事务无关,可以考虑将其原来的值保存,在失败rollback时恢复。
      

  5.   

    在下知道除了序列,都可以回滚,而且我的业务流水号也没有使用事务,可偏偏它就是不回滚,按理说它应该在最后一个Commit之后才能永久生效,可使它的确没有回滚,请大家帮我找找问题的缘由.谢谢!!!!!!!!!
      

  6.   

    在下知道除了序列,都可以回滚,而且我的业务流水号也没有使用序列,可偏偏它就是不回滚,按理说它应该在最后一个Commit之后才能永久生效,可是它的确没有回滚,请大家帮我找找问题的缘由.谢谢!!!!!!!!!
      

  7.   

    除了sequence, 都可以rollback, 
    查查是不是没有触发异常,或在取业务流水号是已经commit,或已自动commit,
    如果没有,直接在每个
    when others then 后加
    rollback;试试。
      

  8.   

    应该是在执行完cp_da_Get_MainSN后自动commit,如何解决呢?
      

  9.   

    cp_da_Get_MainSN中不要加rollback和commit, 由主程序执行。
      

  10.   

    检查一下子过程中的COMMIT和ROLLBACK去掉,就可以了,Oracle的子函数结束后默认不提交的,在最后一个函数或过程的出口处提交.
      

  11.   


    我好像是没有把获得流水好的存储过程中的Commit和Rollback去掉,去掉之后就可以了.谢谢各位!!!
      

  12.   

    我碰到过一个事务不回滚的例子,我们是按照微软推荐的三层结构写的系统,比如说学生做作业,主观题客观题的一起提交,这个需要手动开事务(数据操作层),也就是说我在DataAccess层关了事务,由于我在这一层把Exception全都抓出去了,而在数据操作层中包事务时,如果某一块操作失败,也就是说在这一块里是不回滚的,他只是扔出错误异常,所以在数据操作层中检测不到失败,也就没有回滚。
    想想这也是当时我在类的设计上的失败,惭愧惭愧!!!