oracle 序列詳解

chenoracle發表於2014-09-18

Oracle 序列詳解

 

序列定義

 

序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。不佔用磁碟空間,佔用記憶體。

其主要用途是生成表的主鍵值,可以在插入語句中引用,也可以透過查詢檢查當前值,或使序列增至下一個值。

 

建立序列

 

建立序列需要CREATE SEQUENCE系統許可權。序列的建立語法如下:

  CREATE SEQUENCE 序列名

  [INCREMENT BY n]

  [START WITH n]

  [{MAXVALUE/ MINVALUE n| NOMAXVALUE}]

  [{CYCLE|NOCYCLE}]

  [{CACHE n| NOCACHE}];

    其中:

1)  INCREMENT BY用於定義序列的步長,如果省略,則預設為1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。

2)  START WITH 定義序列的初始值(即產生的第一個值),預設為1。

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

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

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

6)  CACHE(緩衝)定義存放序列的記憶體塊的大小,預設為20。NOCACHE表示不對序列進行記憶體緩衝。對序列進行記憶體緩衝,可以改善序列的效能。

大量語句發生請求,申請序列時,為了避免序列在運用層實現序列而引起的效能瓶頸。Oracle序列允許將序列提前生成 cache x個先存入記憶體,在發生大量申請序列語句時,可直接到執行最快的記憶體中去得到序列。但cache個數也不能設定太大,因為在資料庫重啟時,會清空記憶體資訊,預存在記憶體中的序列會丟失,當資料庫再次啟動後,序列從上次記憶體中最大的序列號+1 開始存入cache x個。這種情況也能會在資料庫關閉時也會導致序號不連續。

7)  NEXTVAL 返回序列中下一個有效的值,任何使用者都可以引用。

8)  CURRVAL 中存放序列的當前值,NEXTVAL 應在 CURRVAL 之前指定 ,二者應同時有效。

 

例子:

SQL> create sequence t1_seq increment by 1 start with 1;

 

使用序列

 

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

列名.NEXTVAL

CURRVAL用於產生序列的當前值,無論呼叫多少次都不會產生序列的下一個值。如果序列還

沒有透過呼叫NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。呼叫CURRVAL

的方法同上,要指出序列名,即用以下方式呼叫:序列名.CURRVAL

SQL> create table t1(id number,qq number,ww number);

SQL> insert into t1 values(t1_seq.nextval,1,1);

1 row created.

SQL> /

1 row created.

SQL> /

 

SQL> /

SQL> /

1 row created.

 

SQL> select * from t1;

 

        ID         QQ         WW

----------     ----------     ----------

         1          1          1

         2          1          1

         3          1          1

         4          1          1

         5          1          1

 

SQL> select t1_seq.currval from dual;

 

   CURRVAL

----------

         5

 

SQL> select t1_seq.nextval from dual;

 

   NEXTVAL

----------

         6

 

SQL> select t1_seq.nextval from dual;

 

   NEXTVAL

----------

         7

 

 

修改序列

 

修改序列的注意事項:

1  必須是序列的擁有者或對序列有 ALTER any sequence許可權

2  只有將來的序列值會被改變

3  改變序列的初始值只能透過刪除序列之後重建序列的方法實現

 

Alter sequence示例:

ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE -- 到10000後從頭開始 NOCACHE ;

 可以影響Sequence的初始化引數:

 SEQUENCE_CACHE_ENTRIES =設定能同時被cache的sequence數目。

SQL> alter sequence t1_seq increment by 2 maxvalue 10 cycle;

alter sequence t1_seq increment by 2 maxvalue 10 cycle

*

ERROR at line 1:

ORA-04013: number to CACHE must be less than one cycle

 

SQL> alter sequence t1_seq increment by 2 maxvalue 40 cycle;

Sequence altered.

 

SQL> insert into t1 values(t1_seq.nextval,1,1);

/

/

……….

/

SQL> select * from t1;

        ID         QQ         WW

----------     ----------     ----------

         1          1          1

         2          1          1

         3          1          1

         4          1          1

         5          1          1

         9          1          1

        11          1          1

        13          1          1

        15          1          1

        17          1          1

       ………………………………………………..

        37          1          1

        39          1          1

         1          1          1

         3          1          1

         5          1          1

 

24 rows selected.

 

 

查詢序列

 

1  透過資料字典USER_OBJECTS可以檢視使用者擁有的序列。

2  透過資料字典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

 

SQL> select object_name,object_type from user_objects;

 

OBJECT_NAM   OBJECT_TYPE

----------        -------------------

T1_SEQ        SEQUENCE

T1            TABLE

 

SQL> select sequence_name,increment_by,cycle_flag,cache_size from user_sequences;

SEQUENCE_N  INCREMENT_BY  CYCLE_FLAG   CACHE_SIZE

----------         ------------       ----------       ----------

T1_SEQ            2             Y            20

 

刪除序列

 

SQL> drop sequence t1_seq;

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

oracle 序列詳解

oracle 序列詳解


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-1273138/,如需轉載,請註明出處,否則將追究法律責任。

相關文章