首页 > 数据库技术 > 详细

oracle之序列问题集

时间:2021-01-06 13:53:46      阅读:17      评论:0      收藏:0      [点我收藏+]

 

创建语句

create sequence REQ_Name
increment by 1 
start with 1
maxvalue 99999 
cycle 
nocache;

 

重置序列(不删除重建方式)

 

Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。

不过还有种巧妙的方式,不用删除,利用步长参数,先查出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;//还原

可以写个存储过程,以下是完整的存储过程,然后调用传参即可:

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;

序列为什么不是从1开始

问题原因:

·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值

·Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性:

当我们创建了新的表(table)和序列(sequence),
在插入(insert)语句时,序列会跳过第一个值(1)。
所以结果是插入的序列值从 2(序列的第二个值) 开始, 而不是 1开始。

想要解决这个问题有两种方法:
更改数据库的“延迟段创建”特性为false(需要有相应的权限)

ALTER SYSTEM SET deferred_segment_creation=FALSE;
或者
在创建表时让seqment立即执行,如:

CREATE TABLE tbl_test(
test_id NUMBER PRIMARY KEY,
test_name VARCHAR2(20)
)
SEGMENT CREATION IMMEDIATE;

oracle之序列问题集

原文:https://www.cnblogs.com/rdchen/p/14240242.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!