获取oracle序列下一个值而不更改它

时间:2014-01-13 14:22:54

标签: oracle sequence nextval

我有一个大问题。我需要知道oracle序列的下一个值而不改变它。

如果我使用sequence.NEXTVAL,我会得到我需要的东西。问题是值已更改,因此下一条记录将获得此值+ 1,这对我不利。

我知道我可以使用sequence.CURRVAL并且它很好,因为它不会更改值,但是如果没有记录,则它不起作用,在这种情况下,序列值可以是任何数字(并且不仅仅是1导致序列值钢存在)。

请帮我找一个解决方案。

谢谢你变化多了!!!!!

5 个答案:

答案 0 :(得分:3)

您绝对不应该依赖于从不丢失序列中的值,因为它们优化了序列编号的并发性。在很多情况下,数字可能会“丢失”。

此外,dba_sequences中可见的值可能不是实际的下一个值,因为数字是从内存缓存中分配的。基础序列元数据表没有关于该缓存使用的数据。您还应该记住,在RAC系统中,每个实例都有自己的序列号缓存。

您可能会描述您尝试解决的问题,因为序列可能不适合您。

答案 1 :(得分:1)

在多用户环境中没有办法。该值已知 - 当您致电.NEXTVAL未知时。序列无法锁定。

答案 2 :(得分:0)

查看

中的“last_number”列
select * from USER_SEQUENCES

编辑:

仅当使用nocache选项创建序列时,此方法才有效。

因此,如果序列确实有缓存设置,则删除它并使用nocache重新创建它,然后您可以使用user_sequences.last_number +1。

请注意,如果序列使用频繁,则会影响性能。另一方面,如果序列没有那么多使用,那就没问题了。

没有编写应用程序(这是最好的解决方案),这只是解决方案。

答案 3 :(得分:0)

我看不出有什么理由要知道序列的下一个值。对于该值的唯一重要性是当您将其用于新记录时。因此,您要么创建一个新记录并立即返回ID值:

declare
  l_id number;
begin
   Insert into table (id) 
   values (sequence.nextval) 
   return id into l_id;

   -- and then do something more with the ID value
end;

或首先获取新ID并在之后使用

declare   
   l_id number; 
begin
   select sequence.nextval    
   into l_id    
   from dual;

    -- then do something with the ID value 
end;

答案 4 :(得分:0)

我能给你的唯一建议是获得nextval然后恢复。但注意:仅在序列未从任何其他会话开始使用时执行这些操作。否则,如果在此操作期间从另一个会话中获取序列,则可能永远不会恢复为原始值。因此在检查之前要小心:

在我的数据库中,seq_test的当前值为6

- 获取下一个值

SQL> SELECT seq_test.NEXTVAL FROM dual;

   NEXTVAL
----------
         7

- 好的,这是下一个值,现在恢复原状

SQL> ALTER SEQUENCE seq_test INCREMENT BY -1;

Sequence altered.

SQL> SELECT seq_test.NEXTVAL FROM dual;

   NEXTVAL
----------
         6

- 按子句

恢复原始增量
SQL> ALTER SEQUENCE seq_test INCREMENT BY 1;

Sequence altered.

- 检查

SQL> SELECT seq_test.CURRVAL FROM dual;

   CURRVAL
----------
         6

我再次警告你,这可能是致命的; - )