日期:2014-05-17  浏览次数:20751 次

自动增长的一个简单问题
我只是想查询一下,下一个自动增长的值是什么用了这个sql语句
select seq_id.nextVal from dual

数据的确读取出来了。可是
在我插入的时候
insert into bug (seq_id, bug_ip, pc_id, desc_cont, bug_date, bug_state)
values (seq_id.NEXTVAL, #bug_ip#, #pc_id#, #desc_cont#, sysdate, 'N')
发现不是原先插入的那个序列了,是那个序列又加一了。


例如这个select seq_id.nextVal from dual得到200

可是插入的时候 insert into bug (seq_id, bug_ip, pc_id, desc_cont, bug_date, bug_state)
values (seq_id.NEXTVAL, #bug_ip#, #pc_id#, #desc_cont#, sysdate, 'N')
得到的201。。。

怎么修改查询的和插入的相等

------解决方案--------------------
select seq_id.CURRVAL from dual 
select seq_id.nextVal 就是取下一个值了 ,和insert一样
------解决方案--------------------
每次调用seq_id.NEXTVAL都会使序列发生改变,因此你想先查询再插入,只能调用一次.NEXTVAL,可以先调用.NEXTVAL,将值保存在一个变量中,此后插入时用那个变量,或者是查询是用.NEXTVAL,插入时用.CURRVAL。
------解决方案--------------------
但需要注意的是.CURRVAL与会话有关,它是取本会话此序列最后一次.NEXTVAL的值。如果你的应用使用了连接池,而你无法保证每次执行的SQL是用的同一个数据库连接,那么就不能在SQL中直接使用.CURRVAL