--序列
/*
定義語法
CREATE SEQUENCE <sequence_name>
INCREMENT BY <integer> 每次的增量
START WITH <integer> 起始值 default=1
MAXVALUE <integer> / NOMAXVALUE 最大值或不限定
MINVALUE <integer> / NOMINVALUE 最小值或不限定
CYCLE / NOCYCLE 達到最大值時循環 或不循環 default NOCYCLE
CACHE <#> / NOCACHE 緩存(default 20) 或不循環
ORDER / NOORDER; 排序或不排序 默認NOORDER
*/
create sequence seq_bird_1
increment by 1 --每次加1
start with 1 --從1開始計數
maxvalue 100000 --最大值
minvalue 1 --最小值
nocycle --一直累加,不循環
cache 20 --緩存 20
noorder --不指定排序順序
;
create sequence ssss;
select ssss.nextval from dual;
alter system flush shared_pool;--清空緩存,需要有足夠的權限
--再次獲取序列的nextval值,會把cache的最後一個值加上增量返回
select ssss.nextval from dual;
--select sys_guid() from dual;
--查詢序列信息 定義屬性信息都可查看到
select * from user_sequences us where us.sequence_name='SEQ_BIRD_1';
select * from user_objects uo where uo.object_name='SEQ_BIRD_1' and uo.object_type='SEQUENCE';
--使用序列
declare
v_seq int;
begin
for i in 1..100 loop--循環取100次
select seq_bird_1.nextval into v_seq from dual;--下一個值
dbms_output.put('nextVal'||v_seq||'------');
--當前值,剛創建的seq,必須執行nextval纔可獲取currval
select seq_bird_1.currval into v_seq from dual;
dbms_output.put('currVal'||v_seq);
dbms_output.put_line('-');
end loop;
end;
select seq_bird_1.nextval from dual;
--修改序列 除了start with不能修改其他的都可以修改
alter sequence seq_bird_1 increment by 2;
--刪除序列
drop sequence seq_bird_1;
--把序列重置,回到初始位置 相當於間距修改序列的start with
--創建用於重置的序列
create sequence seq_test_2 start with 1 increment by 1;
--多執行幾次nextval,
select seq_test_2.nextval from dual;
--創建用於重置序列的過程,參數爲序列的名字
create or replace procedure reset_seq(seq_name varchar2)
as
curr_val int;
d_sql_1 varchar2(200);
d_sql_2 varchar2(200);
begin
--把當前的序列值存放到變量中
d_sql_1 :='select '||seq_name||'.nextval from dual';
execute immediate d_sql_1 into curr_val;
--修改序列增量爲當前當前值的相反數-1
curr_val := -(curr_val-1);
d_sql_2 := 'alter sequence '||seq_name||' increment by '||curr_val;
execute immediate d_sql_2;
--按上面修改的增量執行一次查詢nextval,這時序列當前值變爲1
execute immediate d_sql_1 into curr_val;
--從新設置序列的增量爲1
d_sql_2 := 'alter sequence '||seq_name||' increment by 1';
execute immediate d_sql_2;
--execute immediate d_sql_1 into curr_val;
--dbms_output.put_line('修改後的現在序列初始值是:'||curr_val);
end;
--調用過程
begin
empty_seq('seq_test_2');
end;
--reference
--http://psoug.org/reference/sequences.html