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 表达式都会添加序列。无论后来是否提交或回滚当前事务。

扫描二维码关注公众号,回复: 6202724 查看本文章

假设在终于回滚的事务中指定 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 表达式返回两行添加后的值。和 4。对 tab1 的第一行。数据库server返回 CURRVAL 和 NEXTVAL 添加后的值 3;对 tab1 的第二行。它返回添加后的值 4

猜你喜欢

转载自www.cnblogs.com/ldxsuanfa/p/10849607.html