`
kb5706
  • 浏览: 41045 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

NEXTVAL 和 CURRVAL 运算符和oracle的sequence设置说明

 
阅读更多

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

  1、Create Sequence

  你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,

  CREATE SEQUENCE emp_sequence

  INCREMENT BY 1 --每次加几个

  START WITH 1  --从1开始计数

  NOMAXVALUE   --不设置最大值

  NOCYCLE     --一直累加,不循环

  CACHE 10;

  一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

  CURRVAL=返回sequence的当前值

  NEXTVAL=增加sequence的值,然后返回sequence值

  比如:

  emp_sequence.CURRVAL

  emp_sequence.NEXTVAL

Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1  -- 每次加几个
START WITH 1   -- 从1开始计数
NOMAXVALUE    -- 不设置最大值
NOCYCLE     -- 一直累加,不循环
CACHE 10; --缓存序列个数,有助于提高效率,但可能造成跳号。

- 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

NEXTVAL和CURRVAL运算符(IDS)
可以通过在SQL语句中使用NEXTVAL或CURRVAL运算符来访问序列的值。必须用以sequence.NEXTVAL或sequence.CURRVAL格式驻留在同一个数据库中的序列名称(或同义词)来限定NEXTVAL或CURRVAL。表达式也可以用所有者名来限定序列,如zelaine.myseq.CURRVAL。可以指定sequence的SQL标识或有效同义词(如果存在的话)。
(这段现在还看不太懂,mark一下)


在符合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语句中的这些运算符:


必须对序列有选择特权。

在CREATETABLE或ALTERTABLE语句中,在下列上下文中不能指定NEXTVAL或CURRVAL:

在DEFAULT子句中

在检查约束中。

在SELECT语句中,下列上下文中不能指定NEXTVAL或CURRVAL:

使用DISTINCT关键字时在投影列表中。

在WHERE、GROUPBY或ORDERBY子句中

在子查询中

在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) 


在前面的例子中,数据库服务器把一个增加后的值(或序列的初始值,即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:


SELECTseq_2.CURRVAL,seq_2.NEXTVALFROMtab1;
在前面的示例中,数据库服务器从CURRVAL和NEXTVAL表达式返回两行增加后的值,3和4。对tab1的第一行,数据库服务器返回CURRVAL和NEXTVAL增加后的值3;对tab1的第二行,它返回增加后的值4。

假如在创建sequence时,有意不选用cache选项,有2点需要注意:

1. 访问效率降低,没有cache功能的sequence取值将无法直接访问内存

2. 不论是nocache还是cache , 每次访问nextval的过程都是不可逆的,在同一session中,在执行一系列dml和sequence的操作后,用户执行rollback,希望将操作回滚,但是sequence此时就显得异常顽固,用掉的nextval将无法被重现。当下一次试图读取nextval时,sequence的指针又移动到下一位了。

还有sequence不属于某个表,也不属于某个字段,sequence仅仅属于某个用户。

其实在创建了sequence后,每个表都可以使用这个sequence,但是这样会引起应用的很多麻烦,因此,建议每个表都使用一个sequence。

分享到:
评论

相关推荐

    sequence等同于序列号

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方。 1、Create Sequence (注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限) CREATE ...

    mysql currval 和 nextval 函数的实现.txt

    mysql currval 和 nextval 函数的实现

    Hibernate Oracle sequence的使用技巧

     1、在Oracle sequence首先创建sequence  create sequence seq_idminvalue 1start with 1increment by 1cache 20;  2、在你的hbm.xml中的配置  seq_id  这样再插入数据的时候,Hibernate会自动生成如下语句: ...

    oracle Nextval的用法

    是oracle Nextval的用法,最基本的用法,拔高的不实用

    oracle 主键自增 sequence

    ,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀 胡萝卜须 23:20:42 有啊 緣,仯芣妸訁 23:20:57 ...

    oracle sequence语句重置方介绍

    在开发过程中,可能会用到oracle sequence语句,本文以oracle sequence语句如何重置进行介绍,需要的朋友可以参考下Oracle重置sequence语句1 Sql代码 代码如下: DECLARE n NUMBER(10 ); tsql VARCHAR2(100 ); p_...

    MySQL实现类似Oracle序列的方案

    MySQL实现类似Oracle的序列...Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是: 1、MySQL中新建表,用于存储序列名称和值; 2、创建函数,用于获取序列表中的值; 具体如下: 表结构为:  drop tabl

    sqlserver实现oracle的sequence方法

    如果在ORACLE里面用惯了Sequence的兄弟们,要在SqlServer里实现Sequence,就会发现没有现成的Sequence对象可以Create了。那应该怎么办呢?下面我们在SQLServer中实现Sequence

    Oracle8i_9i数据库基础

    §12.5 运算符和表达式(数据定义) 243 §12.5.1 关系运算符 243 §12.5.2 一般运算符 244 §12.5.3 逻辑运算符 244 §12.6 变量赋值 245 §12.6.1 字符及数字运算特点 245 §12.6.2 Boolean 赋值 245 §12.6.3 ...

    数据结构nextval的求法

    有助于理解nextval的求法,便于理解串的操作,具有易理解性等特点

    nextval求法

    数据结构中nextval求法,和好的解题方法,看了很有收获,欢迎大家,欢迎

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    KMP算法的Next及NextVal序列求解

    今天遇到一个KMP算法的题,以前根本没见过,上网查了好多关于KMP,但是讲的都不是很清楚,看的一头雾水,然后就自己研究做出了一个小程序...希望这个小程序可以帮助大家很好的了解KMP算法Next及NextVal序列的求解算法!

    KMP算法求next 和 nextval

    网上看到的,对kmp算法很好的总结,传上了与大家分享

    Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析

    SELECT TO_CHAR(SYSDATE,’YYMMDD’)||LPAD(REFUNDSEQ.NEXTVAL,6,’0′) AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 LPAD产生的 ‘REFUNDSEQ.NEXTVAL值的前6位有字符,如果不足6位,就用0补足’ ,为防止出现...

    最全的oracle常用命令大全.txt

    一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭...

    Oracle 创建和使用序列

    --创建序列 ...insert into user_table(user_id,user_name,user_pwd) vlaues(seq_user.nextval,'tcy','tcy'); --修改序列 alert sequence seq_user increment by 5 maxvalue 100000 nocycle nocache;

    oracle 重置序列从指定数字开始的方法详解

    重置oracle序列从指定数字开始 代码如下: declare n number(10); v_startnum number(10):=10000001;–从多少开始 v_step number(10):=1;–步进 tsql varchar2(200); v_seqname varchar2(200):=’MIP_JF_SEQUENCE’;...

    Oracle 使用触发器创建自动序列号

    nomaxvalue--不设置最大值 increment by 1--每次加1个 start with 1--从1开始计数,nocycle是一直累加,不循环 cache 20 order; --查序列,小心执行 select seq_customer_id.nextval from SEQ_TEST --插入数据 ...

    oracle数据库经典题目

    1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。 2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须...

Global site tag (gtag.js) - Google Analytics