能够通过在 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 表达式返回两行添加后的值。和 4。对 tab1 的第一行。数据库server返回 CURRVAL 和 NEXTVAL 添加后的值 3;对 tab1 的第二行。它返回添加后的值 4

Oracle中NEXTVAL 和 CURRVAL的使用的更多相关文章

  1. oracle中的CURRVAL和NEXTVAL用法

    原文:https://blog.csdn.net/qianyiyiding/article/details/51592689  1.什么是sequence?其作用是什么? 在Oracle数据库中,什么 ...

  2. Oracle 中select XX_id_seq.nextval from dual 什么意思呢?

    说明 今天看别人的代码 ,遇见了 一条sql    select ctg_fault_list_id_seq.nextval from dual  不懂意思,然后就研究了下 dual :是oracle ...

  3. Oracle中的自动增长字段

    Oracle中的自动增长字段 Oracle 中不像MYSQL 和MSSQLServer 中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段. 在Or ...

  4. oracle中的数据对象

    oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...

  5. oracle中的dual表详解

    oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> s ...

  6. 【转】Oracle中dual表的用途介绍

    原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表, ...

  7. ORACLE中dba,user,v$等开头的常用表和视图

    一.Oracle表明细及说明1.dba_开头表    dba_users           数据库用户信息    dba_segments    表段信息    dba_extents        ...

  8. oracle中sequence(自增序号)的用法

    转载:https://www.cnblogs.com/liuzy2014/p/5794928.html 在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系 ...

  9. 【Oracle】详解Oracle中的序列

    序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建序列的权限 create ...

随机推荐

  1. 在响应式布局中,碰到图片不会自动缩放,因此需要一段js脚本

    <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchang ...

  2. 几个比较好的IT站和开发库官网

    1.IT技术.项目类网站 (1)首推CodeProject,一个国外的IT网站,官网地址为:http://www.codeproject.com,这个网站为程序开发者提供了很好的代码示例以及讲解,不过 ...

  3. 《Hadoop学习之路》学习实践

    (实践机器:blog-bench) 本文用作博文<Hadoop学习之路>实践过程中遇到的问题记录. 本文所学习的博文为博主“扎心了,老铁” 博文记录.参考链接https://www.cnb ...

  4. spring data jpa 关联设计

    MAP关联实体 // @ElementCollection @OneToMany(cascade = {CascadeType.ALL})// @JoinColumn(name = "the ...

  5. javascript中var同时声明多个变量时的原理是什么?

    <script> function show(){ var a=b=c=d=5; } show(); alert(a);//弹a时报错(not defined),而b.c.d都能弹出5 & ...

  6. 关于Oracle中Sort Merge Join的改写

    业务场景的问题,我们有一个刷CUBE的SQL,是Oracle环境,平时跑70多分钟, 但是最近突然不动了,这个SQL需要算累计值,比如年累计客户数量. 累计值是什么意思呢?我们使用下面的数据来说明问题 ...

  7. sqlServer MERGE 对数据进行修改或插入自动视别 特别用于批量数据的插入或修改

    sqlServer MERGE   对数据进行修改或插入自动视别 特别用于批量数据的插入或修改    MERGE  customer AS targetTable   --目标表    USING ( ...

  8. CSV模块的使用

    1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在 ...

  9. spring 转换器和格式化

    Spring总是试图用默认的语言区域将日期输入绑定 到java.util.Date.假如想让Spring使用不同的日期样 式,就需要用一个Converter(转换器)或者 Formatter(格式化) ...

  10. vue中使用v-if判断数组长度是出现length报错

    在vue中使用v-if判断数组的长度时出现报错 <el-collapse-item :key="index" v-if="data.childrens.length ...