Oracle中NEXTVAL 和 CURRVAL的使用
Posted ldxsuanfa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.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?来增长序列时,每一个用户生成一个其他用户不可见的唯一值。
当多个用户并发地添加同一序列时,每一个用户看到的值是有差异的。比如,一个用户可能从一个序列生成一组值,如?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。