我先用语句:
create sequence ProjectID
start with 1000000000       
Maxvalue 9999999999         
Minvalue 1;创建了一个ProjectId的序列号.然后我在程序中用
select ProjectId.nextVal from dual 取序列号.
但是现在遇到一个怪问题.有时候序列号是以1为步长增长的.而是有时候却以任意的步长增长.下面是在程序中取到的序列号
1000000880
1000000860
1000000843
1000000842
1000000841
1000000840
1000000820
1000000800
1000000780
1000000767
1000000766
1000000765
1000000764
1000000763
1000000762
1000000761
可以确定是没有多个程序在调用select ProjectId.nextVal from dual
是不是我的创建序列的语句有问题?

解决方案 »

  1.   

    还有,我觉得这应该不关事务的问题.我把他们取的时间也发出来
    [2007-03-16 21:47:09]Projectid: 1000000764
    [2007-03-16 21:57:52]Projectid: 1000000765
    [2007-03-16 21:59:54]Projectid: 1000000766
    [2007-03-16 22:01:26]Projectid: 1000000767
    [2007-03-16 22:30:58]Projectid: 1000000780
    [2007-03-16 23:06:22]Projectid: 1000000800
    [2007-03-16 23:51:38]Projectid: 1000000820
      

  2.   

    cache参数的默认就是20,也就是说每次oracle会把20个序号读入内存,如果线程关闭然后重新启动,oracle就会放弃已读入内存的序列值,从下一个开始,如果解决此问题可以创建sequence时设置nocache参数。
      

  3.   

    create sequence ProjectID
    minvalue 1
    maxvalue 9999999999
    start with 10000000000
    increment by 1
    nocycle 
    order;
    这样试试
      

  4.   

    以下情况也可能造成不连续的:
    1、读取后因transaction被rollback;
    2、多个进程并发。你可以试一下:
    create table t (a number(10), d date);
    for i in 1 .. 1000 
    begin
      insert into t values (ProjectId.nextVal, sysdate);
    end;
      

  5.   

    谢谢各位,问题已解决.是创建的语句没有指定步长.现在改为
    create sequence Seq_ProjectID
    minvalue 1000000000      
    maxvalue 9999999999
    start with 1
    increment by 1
    cache 300