1. 程式人生 > >oracle sequence

oracle sequence

 在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。  
1、Create   Sequence  
你首先要有CREATE   SEQUENCE或者CREATE   ANY   SEQUENCE許可權,  
CREATE   SEQUENCE   emp_sequence  
INCREMENT   BY   1    --   每次加幾個  
START   WITH   1     --   從1開始計數  
NOMAXVALUE      --   不設定最大值  
NOCYCLE     --   一直累加,不迴圈  
CACHE   10;                 --快取序列個數,有助於提高效率,但可能造成跳號。

一旦定義了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防止這種情況。  

2、Alter   Sequence  
你或者是該sequence的owner,或者有ALTER   ANY   SEQUENCE   許可權才能改動sequence.   可以alter除start至以外的所有sequence引數.如果想要改變start值,必須   drop   sequence   再   re-create   .  
Alter   sequence   的例子  
ALTER   SEQUENCE   emp_sequence  
  INCREMENT   BY   10  
  MAXVALUE   10000  
  CYCLE     --   到10000後從頭開始  
  NOCACHE   ;  


影響Sequence的初始化引數:  
SEQUENCE_CACHE_ENTRIES   =設定能同時被cache的sequence數目。  

可以很簡單的Drop   Sequence  
DROP   SEQUENCE   order_seq;