先说下项目背景:项目有一个场景是生成一个序列号,序列号为yyyyMMdd00000000n。
每天序列号重置。
解决方案和思路:利用序列+存储过程+job实现。
先上代码后解释!!!
先创建一个序列——>
create sequence seq_1 increment by 1 start with 1 maxvalue 999999999;
在创建一个存储过程——>
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-1);
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;
再创建一个job,定时执行。
这个是当前执行一次之后,每隔一分钟执行一次
declare
job number;
begin
sys.dbms_job.submit(job,'seq_reset(''seq_1'');',sysdate,'sysdate+1/1440');
end;
这是当前执行一次后,每天晚上十二点执行一次
declare
job number;
begin
sys.dbms_job.submit(job,'seq_reset(''seq_1'');',sysdate,'trunc(sysdate + 1)');
end;
————————————————————————————————————————
总结归纳:首先存储过程的主题思想是(这段看别人的):
A.先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。
假设需要修改的序列名:seq_name
1、select seq_name.nextval from dual; //假设得到结果5656
2、alter sequence seq_name increment by -5655; //注意是-(n-1)
3、select seq_name.nextval from dual; //再查一遍,走一下,重置为1了
4、alter sequence seq_name increment by 1; //还原
原博地址:http://blog.itpub.net/26474945/viewspace-1768243/
B.创建一个带参的存储过程,这个存储的核心就是A步骤。
我们可以先用sql执行下步骤A,看下是不是能达到我们的预期结果。再执行存储过程,看下存储过程是否能达到预期结果。从而达到分步测试检查的目的
call seq_reset('seq_1');
C.创建一个job,开始时间和间隔执行时间可自行百度,网上一大堆,这里要注意一点的是,job调用存储过程的时候,参数需要用两个单引号圈起来,这一点我耗费了一个多小时才解决!!!