Database DB2中的保留序列范围

Database DB2中的保留序列范围,database,oracle,db2,sequence,database-migration,Database,Oracle,Db2,Sequence,Database Migration,我们正在将应用程序从Oracle迁移到DB2。这是一个批处理作业。有一种排序逻辑,在处理之前为条目分配ID: 序列保留范围 选择MY_SEQUENCE.nextval;//射程(u)开始; 按范围大小改变序列MY_序列增量 选择MY_SEQUENCE.nextval 将序列MY_序列增量改为1 选择MY_SEQUENCE.nextval;//范围(u端); 通过内存中的增量值从范围内分配ID: 对于id=range\u start:range\u end do 这在Oracle中运行良好,但在D

我们正在将应用程序从Oracle迁移到DB2。这是一个批处理作业。有一种排序逻辑,在处理之前为条目分配ID:

序列保留范围

选择MY_SEQUENCE.nextval;//射程(u)开始;

按范围大小改变序列MY_序列增量

选择MY_SEQUENCE.nextval

将序列MY_序列增量改为1

选择MY_SEQUENCE.nextval;//范围(u端);

通过内存中的增量值从范围内分配ID:

对于id=range\u start:range\u end do

这在Oracle中运行良好,但在DB2中产生了意外的结果

在Oracle中:

DROP SEQUENCE MY_SEQUENCE;
CREATE SEQUENCE  MY_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 50000 NOORDER  NOCYCLE ;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100002;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100003;
在DB2中:

DROP SEQUENCE MY_SEQUENCE;
CREATE SEQUENCE MY_SEQUENCE AS DECIMAL(27 , 0)  START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NO CYCLE CACHE 50000 NO ORDER;

SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 150000;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 5000050001;
我认为150000可以用缓存大小来解释。然而,我还不知道5000050001的价值。非常感谢您的帮助

注:

我知道alter语句是非事务性的。但是,该进程在启动并运行非分布式单线程数据库时,具有对该数据库的独占访问权。 DB2在ORA兼容模式下运行 如果使用DB2 sequence next val,DB2中也会出现同样的问题:MY_序列的值next VALUE; 有序序列也有同样的问题
将序列更改为无缓存解决了此问题。

如果smb知道不需要更改为无缓存的更好答案,我将接受。没有其他答案-第一次访问序列缓存的值与CACHE子句指定的值一样多,由于你将增量值设置为100000,序列向前移动50000乘以100000。我认为这是你过程的一部分,这一事实意味着这个过程首先是有缺陷的。ALTER应该很少使用,通常是一次性语句。你到底在做什么,一开始就这样跳远?Autogen id值通常并不重要。这表明您有某种多部分密钥,这违反了良好的规范化实践。如果你真的需要这样做,我会使用两个序列-一个是每次跳100000,另一个是跳1,或者看看行数是否给出合理的结果。但是我需要'alter'在我的过程完成后同步序列,对吗?是的,您仍然需要为下一个批处理作业重置序列,我可能建议您在下一次开始时执行该操作。但我仍然认为,你这样做的事实意味着你有一个糟糕的设计或实施过程。如果这是出于跟踪目的,只需使用一个autogen id。可能每个较大的跳转都会表示什么应该是父表的一部分,而较小的跳转则是子表的一部分……此id不用于跟踪。它对数据进行一些预处理和链接。然而,我同意这看起来不太好。也许一些测序服务会更好。