一、序列介绍
序列是 Oracle
提供的用于产生一系列 唯一数字 的数据库对象。
1. 简单序列
create sequence '序列名称' ;
通过序列的伪列访问序列值 说明 NEXTVAL 返回序列的下一个值 CURRVAL 返回序列的当前值
注意:在刚建立序列后,无法提取当前值 ,只有先提取下一个值时才能再次提取当前值。 ORA-08002: sequence SEQ_TEST.CURRVAL is not yet defined in this session
select '序列名称' . nextval from dual;
select '序列名称' . currval from dual;
2. 复杂序列
CREATE SEQUENCE 'sequence_name'
[ INCREMENT BY 'n' ]
[ START WITH 'n' ]
[ {MAXVALUE 'n' | NOMAXVALUE}]
[ {MINVALUE 'n' | NOMINVALUE}]
[ {CYCLE | 'NOCYCLE' }]
[ {'CACHE' 'n' | NOCACHE}] ;
3. 修改序列
修改序列:使用 ALTER SEQUENCE
语句修改序列。 不能修改序列的 START WITH
参数。
ALTER SEQUENCE '序列名称' MAXVALUE 5000 CYCLE ;
alter sequence '序列名称' increment by 10 ;
alter sequence '序列名称' increment by - 10 ;
4. 删除序列
DROP SEQUENCE '序列名称' ;
二、序列案例
1. 有最大值的非循环序列
create sequence ` seq_test`
increment by 10
start with 10
maxvalue 300
minvalue 20 ;
错误信息:是由于开始值小于最小值(开始值不能小于最小值)。 ORA-04006: START WITH cannot be less than MINVALUE
create sequence ` seq_test`
increment by 10
start with 280
maxvalue 300
minvalue 5 ;
select seq_test. nextval from dual;
select seq_test. nextval from dual;
select seq_test. nextval from dual;
select seq_test. currval from dual;
select seq_test. nextval from dual;
执行语句提取序列值。 当序列值为 300
(最大值)的时候,再次提取值,系统会报异常信息。 ORA-08004: sequence SEQ_TEST.NEXTVAL exceeds MAXVALUE and cannot be instantiated
2. 有最大值的循环序列
create sequence ` seq_test_2`
increment by 10
start with 280
maxvalue 300
minvalue 5
cycle ;
当序列当前值为 300(最大值),再次提取序列的值。
select seq_test_2. nextval from dual;
select seq_test_2. nextval from dual;
select seq_test_2. nextval from dual;
select seq_test_2. currval from dual;
select seq_test_2. nextval from dual;
select seq_test_2. nextval from dual;
由此得出结论。 循环的序列,第一次循环是从开始值开始循环,而第二次循环是从最小值开始循环。
create sequence seq_test_3
increment by 10
start with 10
minvalue 5
cycle ;
因为创建的是一个循环的序列。 所以必须指定最大值,否则会报错。 ORA-04015: ascending sequences that CYCLE must specify MAXVALUE
3. 带缓存的序列
create sequence seq_test3
increment by 10
start with 10
maxvalue 300
minvalue 5
cycle
cache 50 ;
执行上面语句的意思是每次取出 50
个缓存值,但是执行会提示错误。 ORA-04013: number to CACHE must be less than one cycle
错误提示的意思是:缓存设置的数必须小于每次循环的数。
缓存设定的值是 50,而最大值是 300。 因为 cache
是 50 次,但是每次增长值是 10。 这样 50
次缓存提取出的数是 500
(50*10)。
create sequence seq_test_3
increment by 10
start with 10
maxvalue 500
minvalue 10
cycle
cache 50 ;
执行上面语句依然会提示上边的错误。 ORA-04013: number to CACHE must be less than one cycle
因为还存在一个 minvalue
,minvalue
和 maxvalue
之间是 490 个数。 但是缓存是 500,也就是一次循环可以提取 490,而第二次循环就是 500 >= 500。
create sequence seq_test_3
increment by 10
start with 10
maxvalue 500
minvalue 9
cycle
cache 50 ;