Oracle數(shù)據(jù)庫(kù)中序列(SEQUENCE)的用法詳解
在Oracle數(shù)據(jù)庫(kù)中,什么是序列呢?它的用途是什么?序列(SEQUENCE)其實(shí)是序列號(hào)生成器,可以為表中的行自動(dòng)生成序列號(hào),產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。其主要的用途是生成表的主鍵值,可以在插入語(yǔ)句中引用,也可以通過(guò)查詢檢查當(dāng)前值,或使序列增至下一個(gè)值。
創(chuàng)建序列需要CREATE SEQUENCE系統(tǒng)權(quán)限。序列的創(chuàng)建語(yǔ)法如下:
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [] [{CACHE n|NOCACHE}];
INCREMENT BY 用于定義序列的步長(zhǎng),如果省略,則默認(rèn)為1,如果出現(xiàn)負(fù)值,則代表序列的值是按照此步長(zhǎng)遞減的。
START WITH 定義序列的初始值(即產(chǎn)生的***個(gè)值),默認(rèn)為1。
MAXVALUE 定義序列生成器能產(chǎn)生的***值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒(méi)有***值定義,這時(shí)對(duì)于遞增序列,系統(tǒng)能夠產(chǎn)生的***值是10的27次方;對(duì)于遞減序列,***值是-1。
MINVALUE定義序列生成器能產(chǎn)生的最小值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒(méi)有最小值定義,這時(shí)對(duì)于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是?10的26次方;對(duì)于遞增序列,最小值是1。
CYCLE和NOCYCLE 表示當(dāng)序列生成器的值達(dá)到限制值后是否循環(huán)。CYCLE代表循環(huán),NOCYCLE代表不循環(huán)。如果循環(huán),則當(dāng)遞增序列達(dá)到***值時(shí),循環(huán)到最小值;對(duì)于遞減序列達(dá)到最小值時(shí),循環(huán)到***值。如果不循環(huán),達(dá)到限制值后,繼續(xù)產(chǎn)生新值就會(huì)發(fā)生錯(cuò)誤。
CACHE(緩沖)定義存放序列的內(nèi)存塊的大小,默認(rèn)為20。NOCACHE表示不對(duì)序列進(jìn)行內(nèi)存緩沖。對(duì)序列進(jìn)行內(nèi)存緩沖,可以改善序列的性能。
刪除序列的語(yǔ)法是:
DROP SEQUENCE 序列名;
其中:
刪除序列的人應(yīng)該是序列的創(chuàng)建者或擁有DROP ANY SEQUENCE系統(tǒng)權(quán)限的用戶。序列一旦刪除就不能被引用了。
序列的某些部分也可以在使用中進(jìn)行修改,但不能修改SATRT WITH選項(xiàng)。對(duì)序列的修改只影響隨后產(chǎn)生的序號(hào),已經(jīng)產(chǎn)生的序號(hào)不變。
修改序列的語(yǔ)法如下:
創(chuàng)建和刪除序列
例1:創(chuàng)建序列:
CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;
執(zhí)行結(jié)果:
序列已創(chuàng)建。
步驟2:刪除序列:
DROP SEQUENCE ABC;
執(zhí)行結(jié)果:
序列已丟棄。
說(shuō)明:以上創(chuàng)建的序列名為ABC,是遞增序列,增量為1,初始值為10。該序列不循環(huán),不使用內(nèi)存。沒(méi)有定義最小值,默認(rèn)最小值為1,***值為9 999 999。
序列的使用
如果已經(jīng)創(chuàng)建了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來(lái)引用序列的值。
在編號(hào)的過(guò)程中,產(chǎn)生間隙的原因多種多樣。如果一個(gè)存儲(chǔ)過(guò)程從一個(gè)序列中挑選某個(gè)數(shù)字,定為本地變量,但是從來(lái)不用它,這個(gè)數(shù)字就丟失了。它將不能再返回到原序列中,結(jié)果就造成數(shù)值序列中存在一個(gè)間隙。關(guān)系型數(shù)據(jù)庫(kù)模型中不必?fù)?dān)心這一點(diǎn)。但是有時(shí)候人們?cè)谝膺@一點(diǎn),這些人想知道是哪些數(shù)字丟失了。
調(diào)用NEXTVAL將生成序列中的下一個(gè)序列號(hào),調(diào)用時(shí)要指出序列名,即用以下方式調(diào)用:
序列名.NEXTVAL
CURRVAL用于產(chǎn)生序列的當(dāng)前值,無(wú)論調(diào)用多少次都不會(huì)產(chǎn)生序列的下一個(gè)值。如果序列還沒(méi)有通過(guò)調(diào)用NEXTVAL產(chǎn)生過(guò)序列的下一個(gè)值,先引用CURRVAL沒(méi)有意義。調(diào)用CURRVAL的方法同上,要指出序列名,即用以下方式調(diào)用:
序列名.CURRVAL.
產(chǎn)生序列的值。
步驟1:產(chǎn)生序列的***個(gè)值:
SELECT ABC.NEXTVAL FROM DUAL;
執(zhí)行結(jié)果:
NEXTVAL ------------------ 10
步驟2:產(chǎn)生序列的下一個(gè)值:
SELECT ABC.NEXTVAL FROM DUAL;
執(zhí)行結(jié)果:
NEXTVAL ------------------- 11
產(chǎn)生序列的當(dāng)前值:
SELECT ABC.CURRVAL FROM DUAL;
執(zhí)行結(jié)果:
CURRVAL -------------------- 11
說(shuō)明:***次調(diào)用NEXTVAL產(chǎn)生序列的初始值,根據(jù)定義知道初始值為10。第二次調(diào)用產(chǎn)生11,因?yàn)樾蛄械牟介L(zhǎng)為1。調(diào)用CURRVAL,顯示當(dāng)前值11,不產(chǎn)生新值。Oracle的解析函數(shù)為檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時(shí),仍然能夠看到下一個(gè)行(LEAD)或者前一行(LAG)的數(shù)值。
關(guān)于Oracle數(shù)據(jù)庫(kù)序列的知識(shí)就介紹到這里了,希望本次的介紹能夠帶給您一些收獲,謝謝!
【編輯推薦】
 
2010-10-20 09:41:37
 
 
 














 
 
 