如何检索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_sequences
, all_sequences
和dba_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是唯一的出路。