Oracle利用存储过程定时重置序列号

本文介绍了如何在Oracle数据库中通过创建序列、存储过程和Job来每日重置序列号,确保每天从1开始。详细步骤包括创建序列、定义存储过程seq_reset用于调整序列值,以及设置定时Job以在指定时间执行该存储过程。存储过程通过查询序列的nextval,改变增量以重置序列,最后恢复增量为1。文章还提供了不同定时执行Job的示例,并分享了定时任务的简单命令链接。
摘要由CSDN通过智能技术生成

先说下项目背景:项目有一个场景是生成一个序列号,序列号为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;

附定时任务简单命令:https://blog.csdn.net/tianma630/article/details/8547098?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13.control

————————————————————————————————————————

总结归纳:首先存储过程的主题思想是(这段看别人的):

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调用存储过程的时候,参数需要用两个单引号圈起来,这一点我耗费了一个多小时才解决!!!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值