1. 程式人生 > >Oracle中NEXTVAL 和 CURRVAL的使用

Oracle中NEXTVAL 和 CURRVAL的使用

center 替換 pda family cor ansi 個數 例如 union

能夠通過在 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

.NEXTVAL?出如今同一?SQL?語句中返回同樣的值。

除了在同一語句中多次出現這樣的情況以外,每一個?sequence.NEXTVAL?表達式都會添加序列。無論後來是否提交或回滾當前事務。

假設在終於回滾的事務中指定?sequence.NEXTVAL,某些序列數可能被跳過。

使用 CURRVAL

不論什麽對?CURRVAL?的引用返回指定序列的當前值,該值是最後一次對?NEXTVAL?的引用所返回的值。

用?NEXTVAL生成一個新值以後,能夠繼續使用?CURRVAL?訪問這個值。無論還有一個用戶是否添加這個序列。

假設?sequence.CURRVAL?和?sequence.

NEXTVAL?都出如今一個?SQL?語句中,則序列僅僅添加一次。在這樣的情況下。每一個?sequence.CURRVAL?和?sequence.NEXTVAL?表達式都返回同樣的值,無論在語句中sequence.CURRVAL?和?sequence.NEXTVAL?的順序。

序列的並發訪問

序列總是在數據庫中生成唯一值,即使當多個用戶並發地引用同一序列時也沒有可察覺的等待或鎖定。

當多個用戶使用?NEXTVAL?來增長序列時,每一個用戶生成一個其他用戶不可見的唯一值。

當多個用戶並發地添加同一序列時,每一個用戶看到的值是有差異的。比如,一個用戶可能從一個序列生成一組值,如?146?和?8。而還有一個用戶並發地從同一序列生成值?235?和?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的使用