我有以下函数在Oracle序列上调用nextval,但我注意到一个奇怪的行为。功能是:
public class DAOImplementation{
private static SessionFactory factory;
private Session session;
public BigDecimal getSequenceNextVal(){
BigDecimal result = null;
factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
String sql = "select sequence_test.nextval from dual";
Query query = session.createSQLQuery(sql);
result = (BigDecimal) query.uniqueResult();
session.close();
return result;
}
}
当我在控制台中打印上述函数返回的值时,我可以看到正确的下一个值。但是,当我在DB&#34上运行时,从dual"中选择sequence_test.currval。该值与控制台中的值不对应。 如果我从PL / SQL Developer重新连接到Oracle DB并运行"从dual"中选择sequence_test.nextval,结果会增加2(我猜一次是java函数,再一次是执行查询手动地)。
你能帮助我理解这种情况吗?
答案 0 :(得分:2)
sequence.currval
链接到您的数据库会话,实际上并不是您所指的意义上的序列的当前值。基本上currval
将返回nextval
为给定会话生成的最后一个值。
这是因为序列很可能被多个会话改变,因此会话独立当前值的想法很少有意义。
这个属性的名称当然令人困惑......