说明:
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 …