Oracle 中的Sequence介紹

在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。 

 

1 建立序列命令

CREATE SEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n | nomaxvalue]
[minvalue n | nominvalue];
[
NOCYCLE]  -- 

INCREMENT BY
 指定序列號之間的間隔,該值可爲正的或負的整數,但不可爲0。序列爲升序。忽略該子句時,缺省值爲1
START WITH
:指定生成的第一個序列號。在升序時,序列可從比最小值大的值開始,缺省值爲序列的最小值。對於降序,序列可由比最大值小的值開始,缺省值爲序列的最大值。
MAXVALUE
:指定序列可生成的最大值。
NOMAXVALUE
:爲升序指定最大值爲1027,爲降序指定最大值爲-1
MINVALUE
:指定序列的最小值。
NOMINVALUE
:爲升序指定最小值爲1。爲降序指定最小值爲-1026
NOCYCLE
一直累加,不循環

 

一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL 
CURRVAL = 返回 sequence的當前值 
NEXTVAL  = 增加sequence的值,然後返回 sequence 值 
比如: 
emp_sequence.CURRVAL 
emp_sequence.NEXTVAL 

可以使用sequence的地方: 
- 不包含子查詢、snapshot、VIEW的 SELECT 語句 
- INSERT語句的子查詢中 
- NSERT語句的VALUES中 
- UPDATE 的 SET中 

可以看如下例子: 
INSERT INTO emp VALUES 
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); 
SELECT empseq.currval FROM DUAL;
 

但是要注意的是: 
- 第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENT BY值,然後返回增加後的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以如果你在同一個語句裏面使用多個NEXTVAL,其值就是不一樣的。明白? 

- 如果指定CACHE值,ORACLE就可以預先在內存裏面放置一些sequence,這樣存取的快些。cache裏面的取完後,oracle自動再取一組到cache。 使用cache或許會跳號, 比如數據庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache防止這種情況。 

-seq_atable.currval 的值只有在同一次會話中,發生seq_atable.nextval後有效

 

2 更改序列命令

ALTERSEQUENCE [user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE ]
[MINVALUE n | NOMINVALUE]

修改序列可以:
    
修改未來序列值的增量。
    
設置或撤消最小值或最大值。
    
改變緩衝序列的數目。
    
指定序列號是否是有序。

注意:
1,第一次NEXTVAL返回的是初始值
2
,可以alterstart至以外的所有sequence參數.如果想要改變start值,必須 drop sequence  re-create .

3 刪除序列命令

DROP SEQUENCE [user.]sequence_name
用於從數據庫中刪除一序列。

4)牛刀小試

     4.1)創建一個序列號的語句:

-- Create sequence 
create sequence NCME_QUESTION_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
nocache;

4.2SQL中取序列號的用法:

SELECT NCME_QUESTION_SEQ.nextval FROM dual
SELECT NCME_QUESTION_SEQ.CURRVAL FROM dual

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章