oracle數據庫中序列的用法

序列(SEQUENCE)是序列號生成器,可以爲表中的行自動生成序列號,產生一組等間隔的數值(類型爲數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。

創建序列需要CREATE SEQUENCE系統權限。序列的創建語法如下:

CREATE SEQUENCE 序列名 
[INCREMENT BY n] 
[START WITH n] 
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] 
[{CYCLE|NOCYCLE}] 
[{CACHE n|NOCACHE}];
 INCREMENT BY 用於定義序列的步長,如果省略,則默認爲1,如果出現負值,則代表序列的值是按照此步長遞減的。

START WITH 定義序列的初始值(即產生的第一個值),默認爲1。

MAXVALUE 定義序列生成器能產生的最大值。選項NOMAXVALUE是默認選項,代表沒有最大值定義,這時對於遞增序列,系統能夠產生的最大值是10的27次方;對於遞減序列,最大值是-1。

MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義,這時對於遞減序列,系統能夠產生的最小值是?10的26次方;對於遞增序列,最小值是1。

CYCLE和NOCYCLE 表示當序列生成器的值達到限制值後是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值;對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值後,繼續產生新值就會發生錯誤。

CACHE(緩衝)定義存放序列的內存塊的大小,默認爲20。NOCACHE表示不對序列進行內存緩衝。對序列進行內存緩衝,可以改善序列的性能。

刪除序列的語法是:
DROP SEQUENCE 序列名;

 其中:

刪除序列的人應該是序列的創建者或擁有DROP ANY SEQUENCE系統權限的用戶。序列一旦刪除就不能被引用了。

序列的某些部分也可以在使用中進行修改,但不能修改SATRT WITH選項。對序列的修改隻影響隨後產生的序號,已經產生的序號不變。修改序列的語法如下:

創建和刪除序列

例1:創建序列:

CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;

執行結果

序列已創建。
步驟2:刪除序列:

DROP SEQUENCE ABC;

執行結果:

序列已丟棄。

說明:以上創建的序列名爲ABC,是遞增序列,增量爲1,初始值爲10。該序列不循環,不使用內存。沒有定義最小值,默認最小值爲1,最大值爲9 999 999。

 

序列的使用

如果已經創建了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來引用序列的值。

在編號的過程中,產生間隙的原因多種多樣。如果一個存儲過程從一個序列中挑選某個數字,定爲本地變量,但是從來不用它,這個數字就丟失了。它將不能再返回到原序列中,結果就造成數值序列中存在一個間隙。關係型數據庫模型中不必擔心這一點。但是有時候人們在意這一點,這些人想知道是哪些數字丟失了。

調用NEXTVAL將生成序列中的下一個序列號,調用時要指出序列名,即用以下方式調用:

序列名.NEXTVAL

CURRVAL用於產生序列的當前值,無論調用多少次都不會產生序列的下一個值。如果序列還沒有通過調用NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。調用CURRVAL的方法同上,要指出序列名,即用以下方式調用:

序列名.CURRVAL.

產生序列的值。

步驟1:產生序列的第一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果:
 

NEXTVAL 
------------------ 
10

 步驟2:產生序列的下一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果

CURRVAL 
-------------------- 
11

  說明:第一次調用NEXTVAL產生序列的初始值,根據定義知道初始值爲10。第二次調用產生11,因爲序列的步長爲1。調用CURRVAL,顯示當前值11,不產生新值。Oracle的解析函數爲檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時,仍然能夠看到下一個行(LEAD)或者前一行(LAG)的數值。

 

查看序列

同過數據字典USER_OBJECTS可以查看用戶擁有的序列。

通過數據字典USER_SEQUENCES可以查看序列的設置。

例:查看用戶的序列:
 

SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,LAST_NUMBER FROM 
USER_SEQUENCES; 
 執行結果:

SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER

說明:當前用戶擁有兩個序列:ABC和BOOKID。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章