ORACLE PL/SQL 中序列(sequence)的簡易使用方法介紹


如果我是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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM