现在的做法是用sequence,然后保存sequence的最大值,插入的时候用事务处理,并且事务内首先用锁来保证操作者唯一,出错就整个事务回滚这样插入的单据号还是会间断,还有其他的更好的方法嘛?有人推荐用rownum排序字段,结合其他函数来达到单据号连续,不知道行不行?谢谢

解决方案 »

  1.   

    select nvl(min(id),0)+1 from tablename where id in (select id from tablename) and  (id+1) not in (select id from tablename)可以将空的id补起来。
      

  2.   

    创建一张编号表T_SEQ;
    update上锁后,并发交易会等待……begin trans
    update t_seq set seqno=seqno+1
    select seqno from t_seq
    ……
    业务处理
    ……
    if ( 成功 )
      commit trans
    else
      rollback trans
      

  3.   

    建一个table,里边字段只有seq_no;
    预先写一个程序,插入一系列的seq_no;
    下边是一个pl/sql脚本.
    sqlplus -s <oraid> << !!
    begin
    for no in  1 .. <max_seq_no> loop
       insert into seq_table values (no);
    end loop;
    commit;
    end
    再将seq_table 中的seq_no 在原先表中有的删除掉。
    然后写一个trigger.
    对原先表进行插入时,从表seq_table中取min(seq_no).
    delete时,insert into seq_table values(原表的seq_no);
    这样就可以保证连续了。
      

  4.   

    我们也遇到这问题!
    我的解决方法是和前面的朋友有点相似!
    我在Seq_table中建好你用到的号码!
    在里面取,但是在号码里面给另一个字段做为号码的状态!
    当你读出一个号码Update该号码状态为Insert,(默认状态是Read),当你的那边号码插入了以后,
    此时Seq_table中号码的状态为Update;
    如果回滚Seq_table中号码的状态为Read;
      

  5.   

    如果并发操作不大的时候,可以每次都锁表,然后读取max(id)再加1
    实际工作中真的有必要保持单据是连号吗?
    再说利用sequence本来就可以保持连续的单据号,只要保证只有一个程序调用该sequence就可以了。sequence的cache置0就可以了。原本默认是20