oracle 实现流水号定时重置的问题

1,836 阅读1分钟

一、梳理

流水号的递增是我们在开发中经常会遇到的问题,我们可以通过序列实现。通过定时任务执行存储过程定时去重置序列的起始数字以及增量的值。

二、存储过程

入参 V_SEQNAME 是传递要重置的序列

create or replace procedure SEQ_RESET(V_SEQNAME varchar2) as
  N    number(10);
  TSQL varchar2(100);
begin
  execute immediate 'select ' || V_SEQNAME || '.nextval from dual'
    into N;
  N    := -N;
  TSQL := 'alter sequence ' || V_SEQNAME || ' increment by ' || N;
  execute immediate TSQL;
  execute immediate 'select ' || V_SEQNAME || '.nextval from dual'
    into N;
  TSQL := 'alter sequence ' || V_SEQNAME || ' increment by 1';
  execute immediate TSQL;
end SEQ_RESET;

三、新建序列表

四、定时任务

新建一个定时任务,控制好要重置的时间,可以每时每天每个月等等执行重置的存储过程,达到重置序列的目的,VINDA_SEQ为序列表。

五、使用

在记录的新建的before insert的触发器里面将序列的值写入到记录的字段,select VINDA_SEQ.nextval into nextcode from sys.dual; 赋值给变量nextcode,然后 :new.ATTRIBUTE5:=nextcode;ATTRIBUTE5保存着流水号的值。

create or replace trigger vinda_prodcheck_info_TRIGER
  before insert on vinda_prodcheck_info   
  for each row
declare
  nextid number;
  nextcode number;
begin
  IF :new.RECORD_ID IS NULL or :new.RECORD_ID=0 THEN 
    select vinda_prodcheck_info_SEQ.nextval 
    into nextid
    from sys.dual;
    select VINDA_SEQ.nextval 
    into nextcode
    from sys.dual;
    :new.RECORD_ID:=nextid;
    :new.ATTRIBUTE5:=nextcode;
  end if;
end vinda_prodcheck_info_TRIGER;

六、结束

其他博客:
docker安装18.03.0+rancher1.6.17 的容器虚拟化部署
vue.js+iview 实现全局加载的公用方法
欢迎留言评论学习