欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle sequence ( 序列)

程序员文章站 2022-04-04 15:53:47
...
--序列 
/*
定义语法
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