既然存储过程里有
commit
when exception
  rollback;
那么没必要Delphi里再Adoconnection1.CommitTrnas;
RollBackTrans了,虽然Oracle支持嵌套事务处理,但你也没
必要这样做,要头脑清醒!我爱Delphi!

解决方案 »

  1.   

    不是这样的,
    Adoconnection.begintrans
    ....
    ....做相关的操作
    ....  point   A
    调用oracle 中的存储过程生成流水号
          point   B
    ....
    try
    Adoconnection.comminttrans
    except
    Adoconnection.Rollback
    但在执行后只回到 B 点而不是A 点
    这样如果在调用oracle 中的存储过程生成流水号 后commit时只提交oracle 中的存储过程中内容就可以了,PROCEDURE     Update_seq(m_TBLNAME in varchar,m_NewRecNo out number)
    as
     v_REC_NUM s_seq.REC_NUM%TYPE ;
    begin     
        select count(*) into v_REC_NUM 
          from s_seq  
         where upper(TBLNAME) = upper(m_TBLNAME) ;
        if v_REC_NUM >0  then
           update s_seq set REC_NUM=REC_NUM+1 where upper(TBLNAME) = upper(m_TBLNAME) ;
           select REC_NUM into m_NewRecNo
             from s_seq
             where upper(TBLNAME) = upper(m_TBLNAME); 
        else
           insert into s_seq (TBLNAME,REC_NUM) values(m_TBLNAME,1)  ;        
           m_NewRecNo:=1 ;
        end if  ;
        COMMIT ; 
    end;
      

  2.   

    //你这样写就行:try
      //point   A 
      调用oracle 中的存储过程生成流水号
      //point   B
    except
      showmessage('error!');
      exit;
    end;----------------------------PROCEDURE     Update_seq(m_TBLNAME in varchar,m_NewRecNo out number)
    as
     v_REC_NUM s_seq.REC_NUM%TYPE ;
    begin     
        select count(*) into v_REC_NUM 
          from s_seq  
         where upper(TBLNAME) = upper(m_TBLNAME) ;
        if v_REC_NUM >0  then
           update s_seq set REC_NUM=REC_NUM+1 where upper(TBLNAME) = upper(m_TBLNAME) ;
           select REC_NUM into m_NewRecNo
             from s_seq
             where upper(TBLNAME) = upper(m_TBLNAME); 
        else
           insert into s_seq (TBLNAME,REC_NUM) values(m_TBLNAME,1)  ;        
           m_NewRecNo:=1 ;
        end if  ;    COMMIT ;   exception    --只用一层事务处理,Delphi里就不写事务处理语句了,让Oracle进行事务处理
        when others then
          Rollback;
         
    END;
    我爱Delphi!
      

  3.   

    这样是不可以的,
    存储过程中的那个commit 是不可少的可是如果把 外面的事务给不要的话那我的操作就和生成流水号的成了一个事务了还是实现不了我的功能。
    我在delphi 中起用的是一个大的事务而生成流水号的那存储过程只是其中的一个小的功能可在oracle 中的存储过程中的那个commit 是必有的这样如果这个存储过程不是一个新地事务(和外面的分开)那在当中commit 后就把我delphi 中本来还不能提交的事务给提交了从而使我在delphi中起用的事务失效。
    我现在要的是如何在存储过程中的commit 中提交存储过程本身的内容而不是我外面我还不想提交的内容一块给提交。