oracle重置序列从指定数字开始的方法详解
2023-06-13 09:14:40 时间
重置oracle序列从指定数字开始
复制代码代码如下:
declare
nnumber(10);
v_startnumnumber(10):=10000001;--从多少开始
v_stepnumber(10):=1;--步进
tsqlvarchar2(200);
v_seqnamevarchar2(200):="MIP_JF_SEQUENCE";--序列名
begin
executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
n:=v_startnum-n-v_step;--从10000001开始
tsql:="altersequence"||v_seqname||"incrementby"||n;
executeimmediatetsql;
executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
tsql:="altersequence"||v_seqname||"incrementby"||v_step;
executeimmediatetsql;
end;
不通过删除重建方式重置序列值得简单方式。一般来讲,序列在实际开发过程中是经常用到的一种对象,通过它来生成主键是非常方便的,但是有些时候我们需要将其重新置零,通常采用的方式就是删除后重新创建。
下面我们来看一下另外一种方式:
SQL>createsequenceseq_1incrementby1startwith1maxvalue999999999;
序列已创建。
SQL>createorreplaceprocedureseq_reset(v_seqnamevarchar2)as
2nnumber(10);
3tsqlvarchar2(100);
4begin
5executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
6n:=-(n-1);
7tsql:="altersequence"||v_seqname||"incrementby"||n;
8executeimmediatetsql;
9executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
10tsql:="altersequence"||v_seqname||"incrementby1";
11executeimmediatetsql;
12endseq_reset;
13/
过程已创建。
SQL>selectseq_1.nextvalfromdual;
NEXTVAL
---------
2
SQL>/
NEXTVAL
---------
3
SQL>/
NEXTVAL
---------
4
SQL>/
NEXTVAL
---------
5
SQL>execseq_reset("seq_1");
PL/SQL过程已成功完成。
SQL>selectseq_1.currvalfromdual;
CURRVAL
---------
1
SQL>
这样可以通过随时调用此过程,来达到序列重置的目的。
此存储过程写的比较仓促,还可以进一步完善,在此就不再进一步讲述
Oracle重置序列(不删除重建方式)
Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。
不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequence的nextval,记住,把递增改为负的这个值(反过来走),然后再改回来。
假设需要修改的序列名:seq_name
1、selectseq_name.nextvalfromdual;//假设得到结果5656
2、altersequenceseq_nameincrementby-5655;//注意是-(n-1)
3、selectseq_name.nextvalfromdual;//再查一遍,走一下,重置为1了
4、altersequenceseq_nameincrementby1;//还原
可以写个存储过程,以下是完整的存储过程,然后调用传参即可:
createorreplaceprocedureseq_reset(v_seqnamevarchar2)asnnumber(10);
tsqlvarchar2(100);
begin
executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
n:=-(n-1);
tsql:="altersequence"||v_seqname||"incrementby"||n;
executeimmediatetsql;
executeimmediate"select"||v_seqname||".nextvalfromdual"inton;
tsql:="altersequence"||v_seqname||"incrementby1";
executeimmediatetsql;
endseq_reset;
相关文章
- 查询Oracle中记录数的简易方法(oracle查询记录数)
- Linux下快速启动Oracle数据库(linux启动oracle)
- Oracle中多个字段排序的实现方法(oracle多个字段排序)
- 指导用户导出Oracle的实践方法(oracle用户导出)
- 掌握Oracle同义词:一种方法(oracle查看同义词)
- Oracle数据库单表恢复实践指南(oracle单表恢复)
- 深入探究 Oracle 触发器的种类与使用(oracle触发器类型)
- Oracle查看用户信息的方法(oracle显示用户)
- 优化数据库:修改Oracle表结构的方法(修改表结构oracle)
- Oracle数据库备份:表结构保留方法(oracle备份表结构)
- Oracle:探索理解之旅(oracle的理解)
- 解决Oracle日志文件过大的简单方法(oracle日志太大)
- 解决Oracle表被截断问题的有效方法(oracle表被截断)
- 探究Oracle共享内存的查看方法(oracle共享内存查看)
- 查找适合投资的房地产,借助Oracle分析参考(c 房屋oracle)
- 深度剖析JDBC编程之Oracle数据库写入(jdbc写oracle)
- CL连接Oracle,将往日数据灿烂重现(c l连oracle)
- 深入比较ES数据库与Oracle数据库(es数据库和oracle)
- 的方法Oracle中实现多值返回的有效方法(oracle 中返回多值)
- 优化Oracle会话内存占用的方法研究(oracle会话内存占用)
- Oracle中求取余数的简单方法(oracle中求余数)
- 主动学习在Oracle中建立自定义函数(oracle中建函数)
- Oracle求出两者中的最大值(oracle 两者最大值)
- 串Oracle优于字符串的数据库(oracle 不等于字符)
- Oracle驱动上海云大会欢迎大家参与(oracle上海云大会)
- Oracle OMS集群实现高可用性架构(oracle oms集群)