oracle中的CURRVAL和NEXTVAL用法

風靈使發表於2018-10-19

1.什麼是sequence?其作用是什麼?

在Oracle資料庫中,什麼是序列呢?其中的作用是什麼呢?其實sequence是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,在插入之前,獲取序列號nextval值,然後進行插入。也可以通過查詢檢查當前值,或使序列增至下一個值。

2.如何定義一個sequence?

在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方或者在實際開發中,比如一個需求表格中的需求ID是唯一主鍵,都可以用sequence來獲取。

首先在用Oracle序列號之前,我們首先得建立一個序列然後就可以通過CURRVALNEXTVAL,獲取當前表中的返回sequence的當前值、下一個squence的值。可以通過下面的語句來建立Squence:

create sequence INR_REQUIRMENT_SQUENCE    
INCREMENT BY 1 -- 每次加幾個  
START WITH 1 -- 從1開始計數  
NOMAXVALUE -- 不設定最大值  
NOCYCLE -- 一直累加,不迴圈  
CACHE 10;  

上面的語句則建立了一個INR_REQUIRMENT_SQUENCE序列

3.如何獲取一個sequence的值?

SELECT INR_REQUIRMENT_SQUENCE.CURRVAL FROM dual –獲取當前的sequence的值,

第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENT BY值, 然後返回增加後的值。CURRVAL 總是返回當前sequence的值,但是在第一次NEXTVAL 初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次sequence的值, 所以如果你在同一個語句裡面使用多個NEXTVAL。

4.可以在哪些地方使用Sequence?

  • 不包含子查詢、snapshot、VIEW的 SELECT 語句
  • INSERT語句的子查詢中
  • NSERT語句的VALUES中
  • UPDATE 的 SET中
  • 在實際開發中,比如一個表中的主鍵需要先得到主鍵ID,可以用NEXTVAL來獲下一個取序列值,然後再進行其他操作。

5.如何刪除Sequence?

DROP sequence policy_id_seq; policy_id_seq為sequence的名字,如果要改變sequence中的初始值,必須先刪除序列號然後再進行建立。你或者是該sequenceowner,或者有ALTER ANY sequence許可權才能改動sequence,直接用Alter語句進行sequence的更新。


oracle 不一樣的獲取nextval 方式

CREATE OR replace FUNCTION Get_seq_next (seq_name IN VARCHAR2) 
RETURN NUMBER 
IS 
  seq_val NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'select '|| seq_name|| '.nextval from dual' INTO seq_val; 
    RETURN seq_val; 
END get_seq_next; 

相關文章