在 12c 中现在可以创建新的会话级数据库序列来支持会话级序列值。这些序列的类型在有会话级的全局临时表上最为适用。
会话级序列会产生一个独特范围的值,这些值是限制在此会话内的,而非超越此会话。一旦会话终止,会话序列的状态也会消失
SQL> create sequence session_seq start with 1 increment by 1 session;
Sequence created.
SQL> select dbms_metadata.get_ddl('SEQUENCE','SESSION_SEQ','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('SEQUENCE','SESSION_SEQ','SYS')
CREATE SEQUENCE "SYS"."SESSION_SEQ" MINVALUE 1 MAXVALUE 999999999999999999
SQL> select session_seq.nextval from dual;
NEXTVAL
1
另开一个窗口
![](https://s1.51cto.com/images/blog/201801/03/1a5988b3fcf0f27cbf8c02640235bf7a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
可见,序列的值只对SESSION级别有影响,可以通过ALTER SEQUENCE命令对某个序列设置为全局或会话级,如下为将这个序列修改为全局。序列值会从初始值重新开始
SQL> ALTER SEQUENCE session_seq GLOBAL;
Sequence altered.
SQL> select session_seq.nextval from dual;
NEXTVAL
1
SQL> /
NEXTVAL
2
另一个
通过ALTER SQEUENCE命令将序列由全局修改为会话级和将序列从会话级修改为全局有所不同,将序列由全局修改为会话级时,序列的值不会重新初始化,而是根据当前会话的上一个序列值开始,详见下面的测试。
对于会话级序列,CACHE, NOCACHE, ORDER 或 NOORDER 语句会予以忽略。