ORACLE 12C新特性-会话级序列
Feb132014
在12C版本,ORACLE推出了会话级序列,这个功能对会话级的临时表可能会非常有用。下面测试下这个功能。
SQL> create sequence session_seq start with 1 increment by 1 session; Sequence created. SQL> select dbms_metadata.get_ddl('SEQUENCE','SESSION_SEQ','STREAM') FROM DUAL; DBMS_METADATA.GET_DDL('SEQUENCE','SESSION_SEQ','STREAM') -------------------------------------------------------------------------------- CREATE SEQUENCE "STREAM"."SESSION_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOPARTITION
下面打开2个会话SESSION 1和SESSION 2,分别查询这个序列。
SESSION 1查询4次这个序列:
SESSION 1>select session_seq.nextval from dual; NEXTVAL ---------- 1 SESSION 1>/ NEXTVAL ---------- 2 SESSION 1>/ NEXTVAL ---------- 3 SESSION 1>/ NEXTVAL ---------- 4
SESSION 2也查询4次这个序列:
SESSION 2>select session_seq.nextval from dual; NEXTVAL ---------- 1 SESSION 1>/ NEXTVAL ---------- 2 SESSION 1>/ NEXTVAL ---------- 3 SESSION 1>/ NEXTVAL ---------- 4
可见,序列的值只对SESSION级别有影响,可以通过ALTER SEQUENCE命令对某个序列设置为全局或会话级,如下为将这个序列修改为全局。
SESSION 1>ALTER SEQUENCE session_seq GLOBAL; Sequence altered.
SESSION 1再次查询,序列值会从初始值重新开始,即使在这个会话序列的值已经为4,修改序列的全局或会话级模式后,序列会被重新初始化。
SESSION 1>select session_seq.nextval from dual; NEXTVAL ---------- 1 SESSION 1>/ NEXTVAL ---------- 2
SESSION 2再次查询序列,就会正常增长了。
SESSION 2>select session_seq.nextval from dual; NEXTVAL ---------- 3 SESSION 2>/ NEXTVAL ---------- 4
通过ALTER SQEUENCE命令将序列由全局修改为会话级和将序列从会话级修改为全局有所不同,将序列由全局修改为会话级时,序列的值不会重新初始化,而是根据当前会话的上一个序列值开始,详见下面的测试。
SESSION 1>ALTER SEQUENCE session_seq SESSION; Sequence altered. SESSION 1>select session_seq.nextval from dual; NEXTVAL ---------- 3 SESSION 1>/ NEXTVAL --------- 4 SESSION 1>/ NEXTVAL ---------- 5 SESSION 1>/ NEXTVAL ---------- 6
SESSION 1在将序列修改为会话级之前,序列值是2,当将序列由全局改为会话级,查询时,序列值没被重新初始化,而是从3开始。
SESSION 2>select session_seq.nextval from dual; NEXTVAL ---------- 5 SESSION 2>/ NEXTVAL ---------- 6
SESSION 2当前SESSION序列的值是4,也不会被初始化,而是从5开始。那么重新在打开一个会话,序列会从几开始呢?是1还是3还是5呢?
SESSION 3> select session_seq.nextval from dual; NEXTVAL ---------- 5
对新打开的会话,是从5开始的。这是为什么?其实很简单,看下这个序列的元数据就明白了。
SQL> select dbms_metadata.get_ddl('SEQUENCE','SESSION_SEQ','STREAM') FROM DUAL; DBMS_METADATA.GET_DDL('SEQUENCE','SESSION_SEQ','STREAM') -------------------------------------------------------------------------------- CREATE SEQUENCE "STREAM"."SESSION_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 5 CACHE 20 NOORDER NOCYCLE NOPARTITION
从元数据可以看出,这个序列是从5开始的,也就是当将一个序列由全局修改为会话级的时候,对于新打开的会话,这个序列的起始值就是在修改前的序列的下一个值。
———————————————————-end——————————————————————