请教一个关于Oracle序列取值的问题,请大侠指教现在在开发一个程序,后台用的oracle 10g 数据库,其中有个主表,主键是根据记录数逐条递增的字符串,字符串最后5位是用oracle 序列算出的号。
现在业务上需要每天从0点开始,主键的最后5位数从1开始计数,然后到下一天0点开始,该数自动再重1开始计数。
之前我做了个序列用来逐次递增取值,又因为要从每天0点从1开始重新计数,我又写了个job,让JOB在每天0点0分1秒,重建序列,这样的话序列就重新重1开始取值,可是运行了一阵之后,发现JOB每次运行的时间出现了延时,最新一次 是0点1分14秒执行的,这样的话从0点到0点1分14秒之间,我的主键最后5位取的还是重建前计数器的值,可是当0点1分14秒之后,重建了序列后,序列从1开始重新取值,这样就出现了一个严重的问题,0点1分14秒之后,从序列取出的值又可能和 0点到0点1分14秒这段时间取的序列值重复,这就造成了主键重复,请问各位有类似的方案吗,从哪着手解决这个问题?

解决方案 »

  1.   

    你的主键有问题,如果按照你的方式,主键应该是
    to_number(to_char(sysdate,'YYYYMMDDHH24MISS')||to_char(seq_id.nextVal,'00000'))
    精确到年月日时分秒+序列,就不会出现这种问题。
      

  2.   

    建两个序列解决问题,在你第一个job调用的procedure中判断
    1、是奇数天的时候调用序列1生成
    2、是偶数天的时候调用序列2生成相反的在第二个job中
    1、奇数天的时候重建第2个序列
    2、偶数天的时候重建第1个序列这样就不用担心job延迟问题了,总有一个序列会提前一天达到你要的标准。