Java Oracle:生成一个数值序列,其值以某个数字开头

Java Oracle:生成一个数值序列,其值以某个数字开头,java,sql,oracle,Java,Sql,Oracle,我需要在Oracle中为表中的一列定义一个数字序列。 我得到的唯一一个约束要求所有值都以9开头。 因此,自动生成的值列表应如下所示开始: 9,90,91,92…99,900,901…999,9000,9001…9999,90000 您知道如何通过SQL通过适当地创建并按顺序和/或Java代码进行编辑来解决这个问题吗? 在我在网上读到的一些帖子中,人们建议以这种方式修改顺序: ALTER SEQUENCE gokhan.sample_seq INCREMENT BY -500; SELECT go

我需要在Oracle中为表中的一列定义一个数字序列。 我得到的唯一一个约束要求所有值都以9开头。 因此,自动生成的值列表应如下所示开始:

9,90,91,92…99,900,901…999,9000,9001…9999,90000

您知道如何通过SQL通过适当地创建并按顺序和/或Java代码进行编辑来解决这个问题吗? 在我在网上读到的一些帖子中,人们建议以这种方式修改顺序:

ALTER SEQUENCE gokhan.sample_seq INCREMENT BY -500;
SELECT gokhan.sample_seq.NEXTVAL FROM dual;
ALTER SEQUENCE gokhan.sample_seq INCREMENT BY 1;
这需要每次计算新的增量。如果可能的话,我想编写一部分SQL代码来自动化这样的过程


感谢您的支持。

如果您想在java中实现它,我看到的唯一困难是计算给定数字的下一个值。但幸运的是你的边界是10,100,1000的力量。。。否则你会增加1。类似下面的内容应该为您提供一个初步的方法

public class Test {

//A method to check if a given number is a power of ten :

    public static boolean powerOf10(int n) {
        int max_power10 = 1_000_000_000;
        if (n > max_power10 ) return false;
        int i = 1;
        while (i < n) i *= 10;   
        return i == n;
    }

 //Then you can calculate the next value by either adding one or 
 //adding one and multipling by 9 if last value plus one is a power of ten

    public static int nextVal(int lastVal){        
        if(!powerOf10(lastVal + 1)){
            return lastVal + 1;
        }
        return 9 * (lastVal + 1);
    }

//Note: for the sake of readability i omitted the check if the last value is a valid value (a number starting with 9)

//Demo 
    public static void main(String[] args){
        int MIN_VALUE = 9;
        for(int i = MIN_VALUE; i < 10000; i = nextVal(i)){
            System.out.println(i);
        }
    }
}

使用正常序列0,1,2,3,。。。对于从这个序列中检索到的任何x,直接计算你的奇特序列的映射元素

当序列的初始值为0时,元素1-10映射到90-99、元素11-110映射到900-999、元素111-1110映射到9000-9999等。因此,对于输入序列的每个x,例如500,找到区间111的下限,计算下限900的对等点,并计算对等点9389的偏移量

代码:

序列x为 通过级别<1001从双连接中选择级别-1 ,o x,一个为 选择x,当为0时,选择大小写x,然后选择0,将数字填充到'1',将字符1+trunclog10,x,'1'作为一个结束 从序列 ,mx,个,最小为 选择x,one,当x>=one时,选择大小写,然后选择其他one-1/10作为最小值结束 从o 选择x,当为0时,选择案例x,然后选择9,否则x-min+9*power10,1+trunclog10,min end作为m的结果;
转换为PLSQL取决于您。注:将9位连接到正常序列的建议不会产生要求的结果,因为这样的序列会增长10/9倍,在9,90900之后,数字数量会增加1,。。。元素,而在序列中,101001000之后的位数增加1,。。。元素。不过这会简单得多。尽管你没有描述这种逻辑的原因,我还是会考虑用更简单的逻辑来代替。

这听起来像是一个家庭作业。还有什么额外的限制?你不能只使用一个序列,然后把9作为第一个数字加进去吗?像CONCAT'9',sequence.nextval?遗憾的是,这不是一个练习,但幸运的是没有其他限制。关于您的提示,是否可以将字符串与数字值连接起来并将结果保存到数字列中?感谢您的回答,这或多或少就是我在Java方面的想法。您将如何处理数据库序列?