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

frn*_*rno 143 sql oracle sequence

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

谢谢.

编辑和结论

正如Justin Cave所说,尝试"保存"序列号是没有用的

select a_seq.nextval from dual;
Run Code Online (Sandbox Code Playgroud)

足以检查序列值.

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

Oll*_*lie 161

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';
Run Code Online (Sandbox Code Playgroud)

你可以得到各种从序列的元数据user_sequences,all_sequencesdba_sequences.

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

编辑:

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

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你...

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.
Run Code Online (Sandbox Code Playgroud)

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

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated
Run Code Online (Sandbox Code Playgroud)

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

  • `ALL_SEQUENCES`中的`LAST_NUMBER`将不是会话实际给出的最后一个数字,并且不会是从一般调用`sequence_name.nextval`返回的数字.假设您已将序列设置为大于1的"CACHE"(默认值为20),则"LAST_NUMBER"将是缓存中的最后一个数字.无法保证此号码实际上会被提供给任何会话. (14认同)
  • `ALTER SEQUENCE seq INCREMENT BY -1;` 将成为一个问题,除非可以**保证**没有其他会话会调用 `seq.nextval`。否则序列将分发重复值,这通常不是人们想要的。 (2认同)
  • OP确实说“这是数据迁移后的检查”,因此假设数据库没有得到普遍使用并不夸张,但如果情况并非如此,这可能是一个问题。 (2认同)

Ron*_*onK 115

select MY_SEQ_NAME.currval from DUAL;

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


cao*_*aot 10

经常使用以下内容:

select field_SQ.nextval from dual;  -- it will increase the value by 1 for each run
select field_SQ.currval from DUAL;
Run Code Online (Sandbox Code Playgroud)

但是,以下内容可以将顺序更改为您所期望的。可以1是整数(负数或正数)

alter sequence field_SQ increment by 1 minvalue 0
Run Code Online (Sandbox Code Playgroud)