全部博文(136)
分类: Oracle
2008-10-09 17:04:23
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 |