我现在数据库里有个表,存放工单号,工单号是有年月日+4位当天流水组成的,如200904090001,每天必须保证从0001开始,当天的每个流水不重复,一个号删除后,不重复使用,我想了想,只能从序列取,但是序列怎么保证每天都从0001开始呢?

解决方案 »

  1.   

    如果不用存储过程的话直接drop序列号再重建就好了,
    如果用存储过程的话create or replace procedure P_TOOLS_RESET_SEQUENCES
    (
       pi_sequence_name   in varchar2
    )
    as
       vn_number       number;
       vr_sequence  user_sequences%rowtype;
    begin
    -- Modify the last number
      select * into vr_sequence from user_sequences t where t.sequence_name=pi_sequence_name;
      if vr_sequence.max_value-vr_sequence.last_number>0 then
           execute immediate 'alter sequence '||pi_sequence_name||' increment by '||(vr_sequence.max_value-vr_sequence.last_number)|| ' nocache';
           execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
           execute immediate 'alter sequence '||pi_sequence_name||' increment by 1 nocache';
           execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
      end if;
    exception
       when others then
          null;
    end P_TOOLS_RESET_SEQUENCES;
      

  2.   

    在程序里用sql语句重置序列号?
      

  3.   

    如果是存储过程就用我上面给的P_TOOLS_RESET_SEQUENCES
    重置序列号就可以了
      

  4.   

    这个存储过程什么时候执行呢,oracle能设置每天0:00执行这个存储过程么?
      

  5.   

    execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number;
    这个为什么有两句,vn_number又 不是返回值,有必要要这个么。
      

  6.   

    那就在oracle中加个job,设定为每天0:00执行
      

  7.   

    不用序列,用当天最大"工单号"+1,若无为"0001"
    获得工单号
    select nvl(TO_NUMBER(max(工单号))+1,TO_CHAR(sysdate,'yyyymmdd')||'0001') as 新工单号 from 表 
    where SUBSTR(工单号,1,8)=TO_CHAR(sysdate,'yyyymmdd')
      

  8.   

    每天用job将序列drop掉,然后再重新建
      

  9.   

    有了储存过程,再写一个job就可以了
      begin
          dbms_job.submit( job       => :job,
                           what      => 'P_TOOLS_RESET_SEQUENCES;',
                           next_date => select trunc(sysdate+1)+1/3600/24,
                           interval  => 'trunc(sysdate)+1/3600/24' );
    commit;
     end;
    /
      

  10.   

    多谢楼上的几位,尤其是yhuib,
    我发现那个存储过程没有定义序列下面几个属性,是不需要的么?
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 1下面这句就是吧序列的下一个值付给vn_number,但是我觉得没有实际意思,是否可以去掉
    execute immediate 'select '||pi_sequence_name||'.nextval from dual' into vn_number; 
      

  11.   

    每天0:00触发好像不是'trunc(sysdate)+1/3600/24' 这样写的吧
      

  12.   

    dbms_job.submit(:job1,'MYPROC;',sysdate,'trunc(sysdate+1)+1/60/24');
      

  13.   

    每天0:01开始...
    trunc(sysdate)+1/(24*60*60)每天0:01开始...
    上面很多解决方案...任LZ选择..