如何检索Oracle序列,而不增加它的当前值?如何检索Oracle序列,而不增加它的当前值?(How

2019-05-12 21:37发布

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

谢谢。

编辑和结论

正如由Justin洞说这不是有益的尝试“拯救”序列号,以便

select a_seq.nextval from dual;

是不够好,检查序列值。

我仍然保持奥利答案好一个,因为它回答了最初的问题。 但问自己关于不修改,如果你想做到这一点序列的必要性。

Answer 1:

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:

更可靠,如果你的缓存大小不是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之前复位,然后返回到其原始值之后,以确保你没有缓存的很多价值观。



Answer 2:

select MY_SEQ_NAME.currval from DUAL;

请记住,它只能如果您运行select MY_SEQ_NAME.nextval from DUAL; 在当前的会话。



Answer 3:

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

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

可悲的是,如果你没有在你的会话修改的顺序,我相信别人都在说明该NEXTVAL是你唯一的选择是正确的。



Answer 4:

这不是一个答案,真的,我会进入它作为一个评论过这个问题没有被锁定。 这个答案:

为什么你会要吗?

假定有一个表与序列作为主键,并且由插入触发器产生的序列。 如果你想有可用于后续更新记录的顺序,你需要有一种方法来提取价值。

为了确保你得到正确的,你可能想换行INSERT和RONK的事务中的查询。

RONK的查询:

select MY_SEQ_NAME.currval from DUAL;

在上述情况下,RONK的警告并没有因为插入应用和更新将在同一会话发生。



文章来源: How to retrieve the current value of an oracle sequence without increment it?