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补起来。
创建一张编号表T_SEQ; update上锁后,并发交易会等待……begin trans update t_seq set seqno=seqno+1 select seqno from t_seq …… 业务处理 …… if ( 成功 ) commit trans else rollback trans
建一个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); 这样就可以保证连续了。
update上锁后,并发交易会等待……begin trans
update t_seq set seqno=seqno+1
select seqno from t_seq
……
业务处理
……
if ( 成功 )
commit trans
else
rollback trans
预先写一个程序,插入一系列的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);
这样就可以保证连续了。
我的解决方法是和前面的朋友有点相似!
我在Seq_table中建好你用到的号码!
在里面取,但是在号码里面给另一个字段做为号码的状态!
当你读出一个号码Update该号码状态为Insert,(默认状态是Read),当你的那边号码插入了以后,
此时Seq_table中号码的状态为Update;
如果回滚Seq_table中号码的状态为Read;
实际工作中真的有必要保持单据是连号吗?
再说利用sequence本来就可以保持连续的单据号,只要保证只有一个程序调用该sequence就可以了。sequence的cache置0就可以了。原本默认是20