Oracle重置序列发生器(非重建)
来源:互联网 发布:python socket select 编辑:程序博客网 时间:2024/06/05 02:31
1、背景
1.1 背景
项目中有5个序列发生器(分别为:seq1、seq2、seq3、seq4、seq5),各序列发生的作用是产生[10000,19999)、[20000,29999)、[30000,39999)、[40000,49999)、[50000,59999)的数值。创建序列的DDL如下:
CREATE SEQUENCE seq1 START WITH 10001 MAXVALUE 999999999999999999999999999 MINVALUE 10001 increment by 1 NOCYCLE NOCACHE ORDER;
其他的同样,区别只是开始值不同1.2 问题
目前每天晚上00:00有定时任务,作用是删掉序列发生器,然后重建,保证每天的序列发生器是从起始值开始的。
最近一段时间偶尔出问题,经查询,重置序列发生器的定时任务在运行时,有其他定时任务正在使用这些序列发生器,从而导致定时任务失败。
因此,现场要求:既要重置序列发生器,又避免发生异常。
所以,采用非重建的方式重置序列发生器
2、解决方案
创建procedure,如下:
/* 创建人:郑林 2017-8-30 方法说明:重置序列发生器 参数说明:v_seqname序列发生器名称;v_standard序列的起始号码*/create or replace procedure seq_reset(v_seqname varchar2,v_standard number) as n number(10); tsql varchar2(100); begin --获取序列的当前值 execute immediate 'select '|| v_seqname ||'.nextval from dual' into n; n :=v_standard-(n-1); --更改步长 tsql := 'alter sequence '|| v_seqname ||' increment by ' || n; execute immediate tsql; --获取当前值 begin execute immediate 'select '|| v_seqname ||'.nextval from dual' into n; exception when others then if sqlcode='-8004' then tsql:='alter sequence '||v_seqname||' increment by 1'; execute immediate tsql; end if; end; --恢复步长 tsql := 'alter sequence ' || v_seqname ||' increment by 1'; execute immediate tsql; end seq_reset;
参数中v_standard为起始值。这样,重写定时任务,便可解决当前问题
exec seq_reset('seq1',1000);
3、参考资料
1、动态SQL,参考:动态SQL资料链接
2、非重建方式,参考:非重建的链接
阅读全文
0 0
- Oracle重置序列发生器(非重建)
- Oracle重置序列(不删除重建方式)
- Oracle重置序列(不删除重建方式)
- Oracle重置序列(不删除重建方式)
- Oracle序列批量重置
- ORACLE重置序列sequence
- oracle重置序列方法
- oracle 序列重置
- Oracle 序列 每天 重建
- ORACLE删除表,序列发生器,索引操作
- 不通过删除重建方式重置序列值得简单方式。
- 求助:Oracle序列重置的问题
- oracle下重置用户的所有序列
- 【oracle】重置序列的当前值
- oracle 重置序列 nextval 为 1
- Oracle序列的创建与重置
- oracle 12c 重建序列SEQUENCE
- 重建序列
- 手把手教你在Github上建立自己的个人博客网站
- Codeforces Round #430 (Div. 2) 题解
- 横向ListView(一) ——开篇,基础逻辑实现
- Python新式类和经典类的区别
- c# 委托
- Oracle重置序列发生器(非重建)
- MVC+vue.js+iview
- redhat虚拟机磁盘扩容
- 利用Qt开发跨平台APP(二)(iOS)
- 解决Groovy复制文件的乱码
- 18.Redis Cluster
- netty案例
- windows下安装配置mycat
- 网易笔试编程题