首页 文章

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

提问于
浏览 1526
127

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

谢谢 .

EDIT AND CONCLUSION

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

select a_seq.nextval from dual;

足以检查序列值 .

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

3 回答

  • 142

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

    SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;
    

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

  • 109
    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 ,然后再恢复到其原始值,以确保您没有缓存很多值 .

  • 0

    select MY_SEQ_NAME.currval from DUAL;

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

相关问题