標籤:ref stat 緩衝 使用 而且 lan currval ext acl
如果我是C羅 原文 ORACLE PL/SQL 中序列(sequence)的簡易使用方法介紹
sequence在ORACLE中應用十分廣泛,就是序號的意思,會自動增加指定變數,如逐次增加1或者2或者其他.
1.建立序列 Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 許可權
CREATE SEQUENCE CUX_DEMO_SEQUENCE
MINVALUE 1
MAXVALUE 99999999999
START WITH 10000
INCREMENT BY 1
NOCYCLE
CACHE 20
ORDER ;
注釋:
MINVALUE 1 --最小值
MAXVALUE 99999999999 --最大值
START WITH 10000 --起始數值
INCREMENT BY 1 --每次增加1
NOCYCLE --一直累加不迴圈
CACHE 20 --緩衝
ORDER ;
還有一些其他參數,比如:
NOMAXVALUE --無最大值
NOCACHE --不設定緩衝
如果指定CACHE值,ORACLE就可以預先在記憶體裡面放置一些sequence,這樣存取的快些。cache裡面的取完後,oracle自動再取一組到cache。使用cache或許會跳號, 比如資料庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache防止這種情況。
2.使用序列
定義好SEQUENCE,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 SEQUENCE的當前值
NEXTVAL=增加SEQUENCE的值,然後返回 SEQUENCE 值
EXAMPLE:
CUX_DEMO_SEQUENCE.CURRVAL
CUX_DEMO_SEQUENCE.NEXTVAL
可以使用SEQUENCE的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語句
- INSERT語句的子查詢中
- NSERT語句的VALUES中
- UPDATE 的 SET中
可以看如下例子:
INSERT INTO CUX_DEMO_TABLE VALUES
(CUX_DEMO_SEQUENCE.NEXTVAL, 123 , ‘IBAD‘ , ‘MARK‘ ,‘Y‘);
SELECT CUX_DEMO_SEQUENCE.CURRVAL FROM DUAL;
注意:
第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENTBY值,然後返回增加後的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以如果你在同一個語句裡面使用多個NEXTVAL,其值就是不一樣的。
3. 修改序列 ALTER SEQUENCE
你或者是該SEQUENCE的owner,或者有ALTER ANY SEQUENCE 許可權才能改動SEQUENCE. 可以alter除start至以外的所有SEQUENCE參數.如果想要改變start值,必須 DROP SEQUENCE 再 重新建立SEQUENCE .
Alter SEQUENCE
ALTER SEQUENCE CUX_DEMO_SEQUENCE
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000後從頭開始
NOCACHE ;
影響SEQUENCE的初始化參數:
SEQUENCE_CACHE_ENTRIES =設定能同時被cache的SEQUENCE數目。
4.刪除序列 DROP SEQUENCE
可以很簡單的Drop SEQUENCE
DROP SEQUENCE CUX_DEMO_SEQUENCE;
11g中對PL/SQL訪問sequence的一個改進
5.在pl/sql 代碼中訪問一個sequence
在Oracle 11g之前,熟悉pl/sql編程的puber們都知道,當在pl/sql 代碼中訪問一個sequence的時候,一般的做法是,比如:
DECLARE v_n number;
BEGIN
SELECT Seq.Nextval INTO v_n FROM Dual;
....
END;
所以大家都覺得很煩瑣,而且這麼寫有一定的效能上的開銷,但是沒辦法,那麼好了,到了11g,這個問題Oracle開發人員為你排憂了。
在11g中,重新修改了存取方法,不僅僅提高了運行效率而且在pl/sql中的調用方法也變的非常簡單,在11g中,你可以簡單的這樣處理:
DECLARE v_n NUMBER:=Seq.Nextval;
BEGIN
....
END;
ORACLE PL/SQL 中序列(sequence)的簡易使用方法介紹