序列初始化过了,但每次currval都要先nextval,为何?

序列已经初始化过了,但每次要得到seq.currval都要先nextval,为何?

我定义了一个序列,从1开始计数的,已经运行过select ...nextval from dual了。
CREATE SEQUENCE seq_v4u;
select seq_v4u.nextval from dual;

但是我发现每个session要使用currval之前还是要求输入一个select nextval....这是为什么呢?

SQL> select seq_v4u.currval from dual;
select seq_v4u.currval from dual
*
ERROR at line 1:
ORA-08002: sequence SEQ_V4U.CURRVAL is not yet defined in this session


SQL> select seq_v4u.nextval from dual;

   NEXTVAL
----------
        43

SQL> select seq_v4u.currval from dual;

   CURRVAL
----------
        43

unix下查看刚才那个错误:
> oerr ora 8002
08002, 00000, "sequence %s.CURRVAL is not yet defined in this session"
// *Cause: sequence CURRVAL has been selected before sequence NEXTVAL
// *Action: select NEXTVAL from the sequence before selecting CURRVAL


奇怪了,为何每个新的session都需要我选一次nextval? 这样的话我得到的currval不是我需要的值啊!

请指点!!!!

 

最佳答案
renxiao2003
在使用CURRVAL之前必须先使用NEXTVAL


ORACLE的序列规范就是这么定义的,呵呵!:-)
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。

你可能感兴趣的:(oracle,sql,unix)