重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

oracle序列怎么连续 oracle序列循环

关于oracle序列的问题

就是因为你重启数据库的原因吧,因为你设置了缓冲,cache size是保存在内存中的,重启之后应该就消失了,不会被保存。

我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、北屯ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的北屯网站制作公司

嗯,楼上的回答也是原因之一,不过楼上的有一种方法避免,就是在确认会正确commit之后,再取seq的值,不过一般没什么意义,seq只是为了自动生成主键或者是给一个数据编成系统唯一标识用的,没啥意义,不用保持连续

oracle sequence如何循环

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

给你做个实验吧

先建立一个表

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;

oracle创建序列的语法

--创建序列的语法 --

CREATE SEQUENCE SEQ_POS_ORDER_ONLINE_ID

INCREMENT BY 1

START WITH 1000000000000042 -- 从1开始计数 或 MINVALUE 1 或 NOMINVALUE --的设置最小值 不设置最小值

NOMAXvalue -- 不设置最大值 或 MAXVALUE 10 --设置最大值 10

NOCYCLE -- 一直累加,不循环 或

CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

在oracle中建表的时候用的是自动编号, 删除某些记录后如何恢复自动编号的序列号使其连续而不跳号?

如果使用了序列,那么这个跳号的问题只能通过编程来解决,否则是解决不了的。Oracle的序列对象只增加。

可以通过一个触发器来实现序列号字段的处理,一旦插入新数据,就根据扫描的结果,修改序列号字段的值为最大值+1,或者某个值,根据定义的规则确定。

有的财务系统凭证号必须连续,当中间的某一张凭证删除后就有这种需求,要求新产生的凭证号等于删除的那一张。


网站栏目:oracle序列怎么连续 oracle序列循环
转载源于:http://cqcxhl.cn/article/hgsshg.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP