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?来增长序列时,每一个用户生成一个其他用户不可见的唯一值。

当多个用户并发地添加同一序列时,每一个用户看到的值是有差异的。比如,一个用户可能从一个序列生成一组值,如?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

原文地址:https://www.cnblogs.com/ldxsuanfa/p/10849607.html

时间: 2024-10-09 08:28:38

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

数据库中 nextVal,currVal的应用.

x.nextVal  得到x序列下一个序列值,x.currVal 得到x序列当前序列值. 注意:在引用 x.currVal之前必须先引用x.nextVal,否则会报ORA-08002: 序列 x.currVal尚未在此会话中定义. 具体应用 1.创建一个序列: create sequence test_seq increment by 1 start with 1 maxvalue 30 minvalue 0 nocycle cache 10 order; select sequence tes

oracle中的CURRVAL和NEXTVAL用法

原文:https://blog.csdn.net/qianyiyiding/article/details/51592689  1.什么是sequence?其作用是什么? 在Oracle数据库中,什么是序列呢?其中的作用是什么呢?其实sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,在插入之前,获取序列号nextval值,然后进行插入.也可以通过查询检查当前值,或使序列增至下一个值. 2.如何定义

oracle序列的两个参数:nextval和currval简介

oracle序列的两个参数:nextval和currval 我将通过下面的一个实例来体现两个参数的区别 创建个序列: 注:在调用currval的值前,必须先调用nextval的值,否则会报错,如下图中所示: 从上图中我们可以看到,在多次调用时nextval的值会继续增加 在上图中我们可以看到currval的值在会话中多次调用时,还是和自身会话的当前值一样所以nextval的值是每调用一次就增加一次:currval的值调用时,还是和自身会话的当前值一样. 原文地址:http://bbs.delit

ORACLE中dual用法详解

基本上oracle引入dual为的就是符合语法1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的.2. Oracle中的dual表是一个单行单列的虚拟表.3. Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据. 4. Dual表主要用来选择系统变量或求一个表达式的值.5. 更

oracle中设置自增主键

首先,你要有一张表!CREATE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME VARCHAR(25),PHONE VARCHAR(10),ADDRESS VARCHAR(50));如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶!然后,你需要一个自定义的sequenceCREATE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH

Hibernate在oracle中ID增长的方式(续)

引用链接:http://blog.csdn.net/w183705952/article/details/7367272 第二种:设置ID的增长策略是native,但是需要创建一个名字为hibernate_sequence(这个名字好像是hibernate默认的sequence名字,不创建会出错的)的全局使用的sequence,然后再对每一个表的ID生成的时候,使用触发器,取得hibernate_sequence.CURRVAL作为新记录的ID,具体的oracle数据库脚本及hibernate配

Oracle中序列的操作以及使用前对序列的初始化

Oracle中序列的操作以及使用前对序列的初始化 一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minvalue 1 二 初始化序列 select myseq.nextval from dual; 这里值得注意的是,如果先直接写select myseq.currval from dual,会提示会提示myseq.currtval尚未在此会话中定义. www.2cto.com 三 使用序列 初始化序列之后才可

【Oracle】详解Oracle中的序列

序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建序列的权限 create sequence 或 create any sequence 2.  创建序列的语法 CREATE SEQUENCE sequence  //创建序列名        [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1        [STAR

oracle中的数据对象

oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(18), as name varchar2(5), select * from person age number(3), sex varchar2(4) ); 2.删除表 方式一:只会删除表中的内容,不会删除表结构truncate delete 方式二:删除表结构truncate table per