你这个其实挺复杂的,要建立一系列的东西来满足你这个需求
创新互联建站主要从事成都网站设计、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务方山,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
给你做个实验吧
先建立一个表
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序列:
Oracle序列(sequence)是一种数据库项,能够生成一个整数序列。通常用于填充数字类型的主键列。
1、创建序列:
CREATE SEQUENCE sequence_name
[START WITH start_num]
[INCREMENT BY increment_num]
[{MAXVALUE maximum_num|NOMAXVALUE}]
[{MINVALUE minimum_num|NOMINVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE cache_num|NOCACHE}]
[{ORDER|NOORDER}]
其中:
start_num:序列开始整数
increment_num:每次增加的整数增量
maximum:序列最大整数
minimum:序列最小整数
CYCLE:循环生成
NOCYCLE:不循环生成,默认值
cache_num:保存在内存中的整数的个数
NOCACHE:不缓存任何整数
例如:
CREATE SEQUENCE seq_test;(默认值)
CREATE SEQUENCE seq_test START WITH 1 INCREMENT BY 2;
2、使用序列:
SELECT seq_test.nextval FROM dual;
insert into order_status2 (id) values (seq_test.nextval);
3、修改序列:
ALTER SEQUENCE语句来修改序列。可以修改的内容:
不能修改序列的初值
序列的最小值不能大于当前值
序列的最大值不能小于当前值
例如:ALTER SEQUENCE seq_test INCREMENT BY 3;
4、删除序列:
DROP SEQUENCE seq_test;
sequence 本身是不能保证连续的,譬如你用insert语句插入一个sequence number,之后在将这个操作rollback掉,这个时候sequence就丢失了1次。
--创建序列的语法 --
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的序列对象只增加。
可以通过一个触发器来实现序列号字段的处理,一旦插入新数据,就根据扫描的结果,修改序列号字段的值为最大值+1,或者某个值,根据定义的规则确定。
有的财务系统凭证号必须连续,当中间的某一张凭证删除后就有这种需求,要求新产生的凭证号等于删除的那一张。
做一个存储过程,drop此序列,重建序列
做一个Oracle Job,按照你指定时间调度。