当前位置: 首页 > Oracle, Oracle 12c > 正文

ORACLE 12C新特性-会话级序列

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

 

本文固定链接: https://www.dbdream.com.cn/2014/02/oracle-12c%e6%96%b0%e7%89%b9%e6%80%a7-%e4%bc%9a%e8%af%9d%e7%ba%a7%e5%ba%8f%e5%88%97/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2014年02月13日发表在 Oracle, Oracle 12c 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: ORACLE 12C新特性-会话级序列 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , , ,

ORACLE 12C新特性-会话级序列:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter