如果我是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的一個改進
在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;