ORACLE SEQUENCE

victorymoshui發表於2012-02-07

ORACLE SEQUENCE(序列)序列是使用者建立的資料庫物件,他可以有多個使用者共享,用來生成唯一的整數。sequence屬於某個使用者。

序列號的儲存和生成與表無關,因此,同一個序列可以用於多個表。但這樣會引起應用的很多麻煩,因此,建議每個表都是用一個sequence(序列)

序列特性:
1、自動生成唯一編號
2、是一個可共享的物件
3、通常用於建立主鍵值
4、替換應用程式程式碼
5、如果將序列快取記憶體到記憶體中,則可以提高訪問序列值的效率
建立序列語法
CREATE SEQUENCE sequence
                 [START WITH n]
                 [INCREMENT BY n]
                 [{MAXVALUE n | NOMAXVALUE}]
                 [{MINVALUE n | NOMINVALUE}]
                 [{CYCLE | NOCYCLE}]
                 [{CACHE n | NOCACHE}];
EX:
CREATE SEQUENCE employee_seq
                 START WITH 10000
                 INCREMENT BY 1
                 NOMAXVALUE
                 NOCYCLE
                 NOCACHE;
說明:如果指定CACHE值,oracle就可以預先在記憶體裡面放置一些sequence,這樣存取的快些。cache裡面的取完後,oracle自動再取一組到cache。 使用cache或許會跳號,比如資料庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache防止這種情況。
序列相關資料字典   
USER_OBJECTS  
USER_SEQUENCES
EX:
SQL> SELECT object_name,object_name,status      
FROM user_objects      
WHERE lower(object_name)='employee_seq';
OBJECT_NAME       OBJECT_NAME            STATUS
-------------------------- ---------------------------- --------------
EMPLOYEE_SEQ     EMPLOYEE_SEQ            VALID
SQL> SELECT * FROM user_sequences  
2  WHERE LOWER(SEQUENCE_NAME)='employee_seq';
SEQUENCE_NAME   MIN_VALUE MAX_VALUE INCREMENT_BY CY OR CACHE_SIZE LAST_NUMBER
--------------------------- ------------------ ----------------- ----------------------- ----- ----- ----------------------------- ----------------------
EMPLOYEE_SEQ                           1 1.0000E+27                              1     N    N                                      20                10020
NEXTVAL和CURRVAL偽列
1、NEXTVAL會返回下一個可用的序列值。
2、CURRVAL會獲得當前序列值。
3、第一次使用時必須對序列發出NEXTVAL,然後CURRVAL才能包含值,否則,oracle會丟擲ORA-08002: sequence EMPLOYEE_name.CURRVAL is not yet defined in this session
EX:
SQL> SELECT employee_seq.nextval FROM dual;
NEXTVAL
-------------
      10000
SQL> SELECT employee_seq.currval FROM dual;  
CURRVAL
---------------
         10000
使用NEXTVAL和CURRVAL的規則
可以在以下情況下使用:
1、不屬於子查詢一部分的SELECT 語句的SELECT 列表。
2、INSERT 語句中的子查詢的SELECT 列表。
3、INSERT 語句的VALUES 子句。
4、UPDATE 語句的SET 子句。
不能再以下情況下使用:
1、檢視的SELECT 列表。
2、帶有DISTINCT關鍵字的SELECT 語句。
3、帶有GROUP BY 、HAVING或ORDER BY 子句的SELECT 語句。
4、SELECT、DELETE或UPDATE語句中的子查詢。
5、CREATE TABLE或ALTER TABLE語句中的DEFAULT表示式。
修改序列語法
ALTER SEQUENCE sequence
              [INCREMENT BY n]
              [{MAXVALUE n | NOMAXVALUE}]
              [{MINVALUE n | NOMINVALUE}]
              [{CYCLE | NOCYCLE}]
              [{CACHE n | NOCACHE}];
修改序列的說明
1、對序列具有ALTER許可權。
2、修改只會影響以後發生的序列號。
3、如果要從不同的序號處重新開始,則不行刪除原有的序列然後重新建立。
4、系統會執行一些驗證操作。如:系統無法強加一個小於當前序號的新MAXVALUEF。否則丟擲ORA-04009: MAXVALUE cannot be made to be less than the current value。
刪除序列語法
DROP SEQUENCE sequence;
需要具備DROP (ANY) SEQUENCE許可權。

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

相關文章