您描述您按以下顺序获得一个序列值 1、2、21、41、4。您是否从 APEX 中执行 nextval 查询?这可能确实是正确的。
APEX 使用连接池,并且不能通过连接共享序列缓存,因此每个连接都有自己的序列缓存。
假设您有一个包含 5 个连接的连接池。当您在该连接中执行 sequence.nextval 时,每个连接都会创建自己的序列缓存值。
Connection 1 - Sequence cache 1 - 20
Connection 2 - Sequence cache 21 - 40
Connection 3 - Sequence cache 41 - 60
Connection 4 - Sequence cache 61 - 80
Connection 5 - Sequence cache 81 - 100
可以想象,当 APEX 在连接池中控制要使用哪个连接时,不可能事先确定顺序。
简而言之:
- 该序列将按升序生成一个数字,fe 1,2,3,4,5 等.. 不是随机的。
- 该序列中可能存在间隙,fe 1、2、4、5、8、9、10。这里 3,6,7 被跳过并且永远不会再次使用。
- 如果您通过 APEX 运行它,则可以/将使用多个连接,因此将使用多个缓存的序列范围。您将看到的顺序可能是 1,21,41,22,42,2,3,43。从 1 到 21 到 41 再到 22 的跳转不是间隙,而是因为它使用了不同的连接,因此使用了不同的缓存序列范围。我使用了 1、21、41,因此您可以在示例中看到 CACHE 20 的行为。
您可以尝试将其作为脚本执行,以查看正确的行为:
DROP SEQUENCE trial_seq
/
CREATE SEQUENCE trial_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20
/
create table trial_test( id number)
/
insert into trial_test
select trial_seq.nextval
from dual
connect by rownum <= 10
/
select *
from trial_test
/
结果如何?它应该是 1 - 10,或者至少接近该结果。
让我知道这是否回答了您的问题。