你這個(gè)其實(shí)挺復(fù)雜的,要建立一系列的東西來(lái)滿(mǎn)足你這個(gè)需求

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)方山,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220
給你做個(gè)實(shí)驗(yàn)吧
先建立一個(gè)表
create?table?test
(id?varchar2(20)?not?null?primary?key?,
name?varchar2(100));
創(chuàng)建一個(gè)序列
create?sequence?seqTest?
increment?by?1?
start?with?1?
maxvalue?999
nocycle?
cache?10;
創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,這個(gè)很重要,每天半夜12點(diǎn)執(zhí)行一次,這個(gè)主要是把序列重新置0用的,然后還需要定義一個(gè)job來(lái)調(diào)用這個(gè)存儲(chǔ)過(guò)程
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;
然后創(chuàng)建一個(gè)觸發(fā)器
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?;
存儲(chǔ)過(guò)程我沒(méi)測(cè)試,但是編譯能過(guò)去
現(xiàn)在做個(gè)試驗(yàn)
執(zhí)行這樣一個(gè)語(yǔ)句
insert?into?test(name)?values?('aa');
然后你檢查下數(shù)據(jù),然后繼續(xù)插入再看看
select?*?from?test;
如何使用Oracle序列:
Oracle序列(sequence)是一種數(shù)據(jù)庫(kù)項(xiàng),能夠生成一個(gè)整數(shù)序列。通常用于填充數(shù)字類(lèi)型的主鍵列。
1、創(chuàng)建序列:
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:序列開(kāi)始整數(shù)
increment_num:每次增加的整數(shù)增量
maximum:序列最大整數(shù)
minimum:序列最小整數(shù)
CYCLE:循環(huán)生成
NOCYCLE:不循環(huán)生成,默認(rèn)值
cache_num:保存在內(nèi)存中的整數(shù)的個(gè)數(shù)
NOCACHE:不緩存任何整數(shù)
例如:
CREATE SEQUENCE seq_test;(默認(rèn)值)
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語(yǔ)句來(lái)修改序列。可以修改的內(nèi)容:
不能修改序列的初值
序列的最小值不能大于當(dāng)前值
序列的最大值不能小于當(dāng)前值
例如:ALTER SEQUENCE seq_test INCREMENT BY 3;
4、刪除序列:
DROP SEQUENCE seq_test;
sequence 本身是不能保證連續(xù)的,譬如你用insert語(yǔ)句插入一個(gè)sequence number,之后在將這個(gè)操作rollback掉,這個(gè)時(shí)候sequence就丟失了1次。
--創(chuàng)建序列的語(yǔ)法 --
CREATE SEQUENCE SEQ_POS_ORDER_ONLINE_ID
INCREMENT BY 1
START WITH 1000000000000042 -- 從1開(kāi)始計(jì)數(shù) 或 MINVALUE 1 或 NOMINVALUE --的設(shè)置最小值 不設(shè)置最小值
NOMAXvalue -- 不設(shè)置最大值 或 MAXVALUE 10 --設(shè)置最大值 10
NOCYCLE -- 一直累加,不循環(huán) 或
CACHE 10; --設(shè)置緩存cache個(gè)序列,如果系統(tǒng)down掉了或者其它情況將會(huì)導(dǎo)致序列不連續(xù),也可以設(shè)置為---------NOCACHE
如果使用了序列,那么這個(gè)跳號(hào)的問(wèn)題只能通過(guò)編程來(lái)解決,否則是解決不了的。Oracle的序列對(duì)象只增加。
可以通過(guò)一個(gè)觸發(fā)器來(lái)實(shí)現(xiàn)序列號(hào)字段的處理,一旦插入新數(shù)據(jù),就根據(jù)掃描的結(jié)果,修改序列號(hào)字段的值為最大值+1,或者某個(gè)值,根據(jù)定義的規(guī)則確定。
有的財(cái)務(wù)系統(tǒng)憑證號(hào)必須連續(xù),當(dāng)中間的某一張憑證刪除后就有這種需求,要求新產(chǎn)生的憑證號(hào)等于刪除的那一張。
做一個(gè)存儲(chǔ)過(guò)程,drop此序列,重建序列
做一個(gè)Oracle Job,按照你指定時(shí)間調(diào)度。
本文標(biāo)題:oracle序列怎么連續(xù),oracle 序列重復(fù)
文章出自:http://chinadenli.net/article30/hcposo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、品牌網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、靜態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)