小编典典

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

all

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

谢谢。

编辑和结论

正如贾斯汀洞穴所说,尝试“保存”序列号没有用,所以

select a_seq.nextval from dual;

足以检查序列值。

我仍然保持 Ollie 的回答是好的,因为它回答了最初的问题。但是如果你想这样做,问问自己不修改序列的必要性。


阅读 141

收藏
2022-07-30

共1个答案

小编典典

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>';

希望能帮助到你…

编辑2:

如果您的缓存大小不是 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在重置之前将缓存设置为,然后再将其恢复为原始值,以确保您没有缓存很多值。

2022-07-30