oracle sequence如何循环

2024-12-22 12:23:48
推荐回答(2个)
回答1:

你这个其实挺复杂的,要建立一系列的东西来满足你这个需求

 

给你做个实验吧

 

先建立一个表

create table test
(id varchar2(20) not null primary key ,
name varchar2(100));

创建一个序列

create sequence seqTest 
increment by 1 
start with 1 
maxvalue 999
nocycle 
cache 10;

 

创建一个存储过程,这个很重要,每天半夜12点执行一次,这个主要是把序列重新置0用的,然后还需要定义一个job来调用这个存储过程

create or replace procedure p_seq
as
n number(10);
v_sql varchar2(100);
begin
select seqTest.nextval into n from dual;
n:=-(n-1);
v_sql:='alter sequence seqTest increment by'|| n;
execute immediate v_sql;
select seqTest.nextval into n from dual;
v_sql:='alter sequence seqTest increment by 1';
execute immediate v_sql;
end;

 

然后创建一个触发器

create or replace trigger t_test       
before insert on test       
for each row       
begin       
select to_char(sysdate,'yyyymmdd')||'_'||lpad(seqTest.nextval,3,0) into :new.id from dual;     
end ;

存储过程我没测试,但是编译能过去

现在做个试验

执行这样一个语句

insert into test(name) values ('aa');

然后你检查下数据,然后继续插入再看看

select * from test;

回答2:

在oracle中,sequence设置了cycle就可以循环。

基本语法如下:

CREATE SEQUENCE sequence  //创建序列名称
       [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
       [START WITH n]    //开始的值,递增默认是minvalue 递减是maxvalue
       [{MAXVALUE n | NOMAXVALUE}] //最大值
       [{MINVALUE n | NOMINVALUE}] //最小值
       [{CYCLE | NOCYCLE}] //循环/不循环
       [{CACHE n | NOCACHE}];//分配并存入到内存中

语法解释:

{
Create 创建
Sequence 序列 seqEmop 序列名称
Increment by 步长
Stat with 1 开始值
Maxvalue  最大值
Minvalue  最小值
Cycle 循环 nocycle 不循环
Cache 缓存   CacheNextvalue 下一个
Currval 当前值
 
}