如何在不增加的情况下检索oracle序列的当前值?

是否有SQL指令来检索不增加它的序列的值 .

谢谢 .

EDIT AND CONCLUSION

正如Justin Cave所述,尝试“保存”序列号是没有用的

select a_seq.nextval from dual;

足以检查序列值 .

我仍然把奥利的答案作为好的答案,因为它回答了最初的问题 . 但是问问自己,如果你想做的话,不要修改序列的必要性 .

回答(3)

3 years ago

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

您可以从 user_sequencesall_sequencesdba_sequences 获取各种序列元数据 .

这些视图适用于各个会话 .

EDIT:

如果序列在您的默认架构中,则:

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

如果您想要所有元数据,那么:

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

希望能帮助到你...

EDIT2:

如果缓存大小不是1,那么可靠的方法是:

SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

请注意,如果其他人在此期间使用序列 - 他们(或您)可能会得到

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

此外,您可能希望在重置之前将缓存设置为 NOCACHE ,然后再恢复到其原始值,以确保您没有缓存很多值 .

3 years ago

select MY_SEQ_NAME.currval from DUAL;

请记住,只有在当前会话中运行 select MY_SEQ_NAME.nextval from DUAL; 时它才有效 .

3 years ago

我的原始回复事实上是不正确的,我很高兴它被删除了 . 下面的代码将在以下条件下工作:a)您知道没有其他人修改过序列b)您的会话修改了序列 . 在我的情况下,我遇到了一个类似的问题,我在调用一个修改值的过程,我相信这个假设是正确的 .

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

遗憾的是,如果您没有修改会话中的序列,我相信其他人说NEXTVAL是唯一可行的方法是正确的 .