如何检索oracle序列的当前值而不增加它呢?

是否有一个SQL指令来检索不增加序列的值。

谢谢。

编辑和结论

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

select a_seq.nextval from dual; 

足以检查序列值。

我仍然保留奥利答案,因为它回答了最初的问题。 但是如果你想要这样做的话,问问你自己有没有修改序列的必要性。

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

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

这些观点适用于各个会议。

编辑:

如果序列处于默认模式,则:

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

如果你想要所有的元数据:

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

希望能帮助到你…

EDIT2:

如果您的caching大小不是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 

此外,您可能希望在重置之前将caching设置为NOCACHE ,然后再恢复到原始值,以确保您没有caching大量值。

select MY_SEQ_NAME.currval from DUAL;

请记住,它只适用select MY_SEQ_NAME.nextval from DUAL;运行select MY_SEQ_NAME.nextval from DUAL; 在当前会议。

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

 SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL; 

可悲的是,如果你在会议中没有修改序列,我相信别人是正确的,说明NEXTVAL是唯一的出路。