Oracle中NEXTVAL 和 CURRVAL的使用
能夠通過在 SQL 語句中使用?NEXTVAL?或?CURRVAL?運算符來訪問序列的值。必須用以?sequence.NEXTVAL?或sequence.CURRVAL?格式駐留在同一個數據庫中的序列名稱(或同義詞)來限定?NEXTVAL?或?CURRVAL。
表達式也能夠用全部者名來限定序列,如?zelaine.myseq.CURRVAL。能夠指定?sequence?的 SQL 標識或有效同義詞(假設存在的話)。
在符合?ANSI?的數據庫中。假設您不是全部者,必須用全部者名(owner.sequence
要對序列使用?NEXTVAL?或?CURRVAL。必須對序列具有選擇特權或對數據庫具有?DBA?特權。
關於序列級特權的信息,請參閱?GRANT?語句。
使用 NEXTVAL
第一次訪問一個序列。在引用?sequence.CURRVAL?之前必須先引用?sequence.NEXTVAL。第一次引用NEXTVAL,返回序列的初始值。
後面每次引用?NEXTVAL,用已定義的?step?添加序列值並返回序列新的添加以後的值。
在一個?SQL?語句中僅僅能對給定的序列添加一次。
即使在一個語句中多次指定?sequence.NEXTVAL,序列也僅僅添加一次,所以每次?sequence
除了在同一語句中多次出現這樣的情況以外,每一個?sequence.NEXTVAL?表達式都會添加序列。無論後來是否提交或回滾當前事務。
假設在終於回滾的事務中指定?sequence.NEXTVAL,某些序列數可能被跳過。
使用 CURRVAL
不論什麽對?CURRVAL?的引用返回指定序列的當前值,該值是最後一次對?NEXTVAL?的引用所返回的值。
用?NEXTVAL生成一個新值以後,能夠繼續使用?CURRVAL?訪問這個值。無論還有一個用戶是否添加這個序列。
假設?sequence.CURRVAL?和?sequence.
序列的並發訪問
序列總是在數據庫中生成唯一值,即使當多個用戶並發地引用同一序列時也沒有可察覺的等待或鎖定。
當多個用戶使用?NEXTVAL?來增長序列時,每一個用戶生成一個其他用戶不可見的唯一值。
當多個用戶並發地添加同一序列時,每一個用戶看到的值是有差異的。比如,一個用戶可能從一個序列生成一組值,如?1、4、6?和?8。而還有一個用戶並發地從同一序列生成值?2、3、5?和?7。
限制
NEXTVAL?和?CURRVAL?僅僅在 SQL 語句中有效。並不在 SPL 語句中直接有效。(可是使用?NEXTVAL?和CURRVAL?的 SQL 語句可用於 SPL 例程。
)下面限制應用於?SQL?語句中的這些運算符:
- 必須對序列有選擇特權。
- 在?CREATE TABLE?或?ALTER TABLE?語句中,在下列上下文中不能指定?NEXTVAL?或?CURRVAL:
- 在?DEFAULT?子句中
- 在檢查約束中。
- 在?SELECT?語句中。下列上下文中不能指定?NEXTVAL?或?CURRVAL:
- 使用?DISTINCT?keyword時在投影列表中。
- 在?WHERE、GROUP BY?或?ORDER BY?子句中
- 在子查詢中
- 在?UNION?運算符結合?SELECT?語句時。
- 在下列這些上下文中也不能指定?NEXTVAL?或?CURRVAL:
- 在分段存儲表達式中
- 在對還有一個數據庫中的遠程序列對象的引用中。
演示樣例
在下面的樣例中,假設沒有其他用戶並發地訪問序列而且用戶連續運行語句。
演示樣例基於下列序列和表:
CREATE SEQUENCE seq_2 INCREMENT BY 1 START WITH 1 MAXVALUE 30 MINVALUE 0 NOCYCLE CACHE 10 ORDER; CREATE TABLE tab1 (col1 int, col2 int); INSERT INTO tab1 VALUES (0, 0);
能夠在?INSERT?語句的?values?子句中使用?NEXTVAL(或?CURRVAL),例如以下面演示樣例中所看到的:
INSERT INTO tab1 (col1, col2) VALUES (seq_2.NEXTVAL, seq_2.NEXTVAL)
在前面的樣例中。數據庫server把一個添加後的值(或序列的初始值。即?1)插入到表的?col1?和?col2?列。
能夠在?UPDATE?語句的?SET?子句中使用?NEXTVAL(或?CURRVAL),例如以下面演示樣例中所看到的:
UPDATE tab1 SET col2 = seq_2.NEXTVAL WHERE col1 = 1;
在前面的樣例中。seq_2?序列增長以後的值。即?2,替換了?col2?中?col1?等於?1?的值。
下面演示樣例顯示了怎樣在?SELECT?語句的 Projection 子句中使用?NEXTVAL?和?CURRVAL:
SELECT seq_2.CURRVAL, seq_2.NEXTVAL FROM tab1;
在前面的演示樣例中,數據庫server從?CURRVAL?和?NEXTVAL?表達式返回兩行添加後的值。3?和?4。對?tab1?的第一行。數據庫server返回?CURRVAL?和?NEXTVAL?添加後的值?3;對?tab1?的第二行。它返回添加後的值?4。
Oracle中NEXTVAL 和 CURRVAL的使用