Bootstrap

ORACLE 序列重置

说明:
ORACLE中一般将自增sequence重置时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。
不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。
有的时候我们需要定期重置序列,比如每天或者每个月的开始都从一个指定的值开始。
可以写个存储过程,以下是完整的存储过程,然后调用传参,并创建定时任务定期重置。

以下代码仅供参考:

创建测试序列

create sequence seq_test increment by 1 start with 1000 nomaxvalue nocycle nocache;

多执行几次,增加序列的值

select seq_test.nextval from dual;

创建重置序列的存储过程
create or replace procedure seq_reset(seq_name varchar2)  as
  v_num       number(10);
  v_start_num number(10) := 1000; --序列起始值(自定义)
  v_step_num  number(10) := 1; --序列步长
  v_sql       varchar2(200);
  v_seq       varchar2(200); --序列名
begin
  v_seq:= seq_name;
  execute immediate 'select ' || v_seq || '.nextval from dual' into v_num;
  v_num := v_start_num - v_num - v_step_num-1; --将步长改为负数
  v_sql := 'alter sequence ' || v_seq || ' increment by ' || v_num;
  execute immediate v_sql;
  execute immediate 'select ' || v_seq || '.nextval from dual' into v_num; --将序列起始值重置为指定的值
  v_sql := 'alter sequence ' || v_seq || ' increment by ' || v_step_num;
  execute immediate v_sql;
  execute immediate 'select ' || v_seq || '.nextval from dual' into v_num;
end;
重置序列
begin
 seq_reset('seq_test');
end;
创建定时任务,定时重置序列(自定义)

create job …

;