现在的位置: 首页 > 综合 > 正文

oracle 序列

2018年05月07日 ⁄ 综合 ⁄ 共 1318字 ⁄ 字号 评论关闭

1、oracle创建序列:

CREATE SEQUENCE emp_sequence 
     INCREMENT BY 1   — 每次加几个 
     START WITH 1     — 从1开始计数 
     NOMAXVALUE       — 不设置最大值 
     NOCYCLE          — 一直累加,不循环 
     CACHE 10; 

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL 
CURRVAL=返回 sequence的当前值 
NEXTVAL=增加sequence的值,然后返回 sequence 值

注:第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT
BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。


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


2、在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定
sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。

 
     任何对CURRVAL的引用返回指定序列的当前值,该值是最后一次对NEXTVAL的引用所返回的值。
用NEXTVAL生成一个新值以后,可以继续使用 CURRVAL访问这个值,不管另一个用户是否增加这个序列。如果sequence.CURRVAL和
sequence.NEXTVAL都出现在一个 SQL语句中,则序列只增加一次。在这种情况下,每个sequence.CURRVAL和 sequence.NEXTVAL表达式都返回相同的值,不管在语句中sequence.CURRVAL和sequence.NEXTVAL的顺序。

eg:

select seq_num.currval, seq_num.nextval, seq_num.nextval, seq_num.currval,seq_num.nextval from dual  
返回结果为:
5,5,5,5,5


3、序列可能间断:每个sequence.NEXTVAL表达式都会增加序列,无论后来是否提交或回滚当前事务。如果在最终回滚的事务中指定sequence.NEXTVAL,某些序列数可能被跳过。此外,重启实例也会导致间断。


4、序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如
11、14、16 和 18,而另一个用户并发地从同一序列生成值 12、13、15 和 17。

抱歉!评论已关闭.