我有一个大问题。我需要知道oracle序列的下一个值而不改变它。
如果我使用sequence.NEXTVAL
,我会得到我需要的东西。问题是值已更改,因此下一条记录将获得此值+ 1,这对我不利。
我知道我可以使用sequence.CURRVAL
并且它很好,因为它不会更改值,但是如果没有记录,则它不起作用,在这种情况下,序列值可以是任何数字(并且不仅仅是1导致序列值钢存在)。
请帮我找一个解决方案。
谢谢你变化多了!!!!!
答案 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
我再次警告你,这可能是致命的; - )