zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

oracle重置序列从指定数字开始的方法详解

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;