SEQUENCE就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方
创建SEQUENCE语法如下:
一旦定义了SEQUENCE,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回?SEQUENCE的当前值
NEXTVAL=增加 SEQUENCE的值,然后返回 SEQUENCE 值
比如:
SEQUENCE_NAME.CURRVAL
SEQUENCE_NAME.NEXTVAL
例如:
SQL> conn scott/oracle
Connected.
SQL> create sequence seq_test
2 increment by 10
3 start with 10
4 nomaxvalue
5 /
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
10
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
20
SQL> select seq_test.currval from dual;
CURRVAL
----------
20
修改SEQUENCE:
SQL> alter sequence seq_test
2 increment by 5
3 maxvalue 9999
4 cycle
5 cache 10
6 /
Sequence altered.
SQL> select seq_test.currval from dual;
CURRVAL
----------
20
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
25
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
30
关于cache参数的理解:
如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。
如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache sequence,还会导致如下问题:
由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于sequence生成的列创建的索引造成实例间大量索引块争用。
基于以上问题,避免创建nocache sequence。
cycle/nocycle用于控制是否循环:
如:
SQL> alter sequence seq_test
2 increment by 10
3 maxvalue 100
4 nocycle
5 cache 10
6 /
NEXTVAL
----------
100
SQL> select seq_test.nextval from dual;
select seq_test.nextval from dual
*
ERROR at line 1:
ORA-08004: sequence SEQ_TEST.NEXTVAL exceeds MAXVALUE and cannot be
instantiated
SQL> alter sequence seq_test
2 increment by 10
3 maxvalue 100
4 cycle
5 cache 10
6 /
Sequence altered.
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
1
SQL> select seq_test.nextval from dual;
NEXTVAL
----------
11
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-1145813/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29320885/viewspace-1145813/