oracle序列cache未使用完,SEQUENCE — cache 的用处

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

SQL> create sequence SEQ_TEST1

2  minvalue 1

3  maxvalue 1000

4  start with 1

5  increment by 1

6  cache 20

7  order;

序列已创建。

-- 刚刚创建的序列必须先用 nextval 来获取一个初始值

SQL> select SEQ_TEST1.currval from dual;

select SEQ_TEST1.currval from dual

*

ERROR 位于第 1 行:

ORA-08002: 序列 SEQ_TEST1.CURRVAL 尚未在此会话中定义

SQL> select SEQ_TEST1.nextval from dual;

NEXTVAL

----------

1

SQL> select SEQ_TEST1.currval from dual;

CURRVAL

----------

1

-- 清空 cache 中缓存的序列值

SQL> alter system flush shared_pool;

系统已更改。

-- 查询当前值,没有变化,仍是1

SQL> select SEQ_TEST1.currval from dual;

CURRVAL

----------

1

-- 查询下一个值:Oracle 发现 cache 中的序列值没有了,会再次产生20个序列值供使用。

-- 所以这里得到的结果不是2,而是21。

SQL> select SEQ_TEST1.nextval from dual;

NEXTVAL

----------

21

-- 再试一次

SQL> alter system flush shared_pool;

系统已更改。

SQL> select SEQ_TEST1.currval from dual;

CURRVAL

----------

21

SQL> select SEQ_TEST1.nextval from dual;

NEXTVAL

----------

41

-- 问题:Oracle 下一次取的20个值是从哪里开始计算的呢,是 currval + 20,

-- 还是每个 cache + 20 呢?我们试验一下。

SQL> select SEQ_TEST1.nextval from dual;

NEXTVAL

----------

42

-- 现在序列的当前值是42。如果是用 currval + 20 来计算,那么清空 cache 后,

-- 获得的 nextval 应该是62;如果是 cache + 20,那应该是 61。

-- 看看实验结果吧:

SQL> alter system flush shared_pool;

系统已更改。

SQL> select SEQ_TEST1.currval from dual;

CURRVAL

----------

42

SQL> select SEQ_TEST1.nextval from dual;

NEXTVAL

----------

61

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值