暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle序列重置(非删除重建)

www 2025-03-11
430

oracle序列重置(非删除重建)

方式一:通常是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。 
方式二:不用删除,利用步长参数,先查出sequence的nextval(下一次序列值),然后把递增改为负的值(反减),然后再还原。 

假设需要修改的序列名:seq_name 
1、select seq_name.nextval from dual;               #假设得到结果100 
2、alter sequence seq_name increment by -99;        #修改递增为负值,注意是-(n-1) 
3、select seq_name.nextval from dual;               #再查一遍,走一下,重置为1了 
4、alter sequence seq_name increment by 1;          #还原递增为1 

写个存储过程(seq_reset),然后调用传参:
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;

存储过程创建以后,调用该存储过程,参数是要重置的序列名:
call reset_seq(‘seq_name’);

使用下面的SQL语句查询需要重置的序列:
SELECT  a.sequence_name 序列名称,
a.min_value 序列最小值,
to_char(to_number( a.max_value)) 序列最大值,
a.last_number 序列下次值,
CASE WHEN a.last_number<3 THEN '--不需要重置;' ELSE
'CALL seq_reset(''' || a.sequence_name || ''');' END 重置序列脚本,
'DROP SEQUENCE ' || a.sequence_name 删除序列脚本,
'RENAME ' || a.sequence_name || ' TO {newname}'  重命名脚本
FROM USER_SEQUENCES a WHERE a.last_number<>0
ORDER BY a.sequence_name ASC;

查看所有序列的值:
select * from user_sequences

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论