Oracle数据库原生生成4位字母数字序列的实现方案咨询
Oracle生成长度为4位字母数字序列的解决方案
方案1:一次性生成指定数量序列(适合批量造数场景)
不需要提前创建数据库对象,直接通过笛卡尔积生成,20万条数据执行效率极高:
- 核心逻辑:先生成0-9、A-Z共36个基础字符的集合,4组字符集合做笛卡尔积就能得到所有36^4=1679616种4位组合,按需截取条数即可。
- 执行代码:
WITH char_set AS ( -- 生成36个基础字符:0-9、A-Z SELECT CASE WHEN level <=10 THEN to_char(level-1) ELSE chr(ascii('A') + level -11) END AS c FROM dual CONNECT BY level <= 36 ) SELECT c1.c||c2.c||c3.c||c4.c AS serial_num FROM char_set c1, char_set c2, char_set c3, char_set c4 WHERE rownum <= 200000; -- 按需修改要生成的条数,最多可到1679616条
- 若需要直接存入表,在语句前加
INSERT INTO 目标表(序列字段)即可。
方案2:持续生成不重复序列(适合后续新增数据使用)
通过序列+转换函数实现,每次调用自动生成下一个符合格式的序列,不会重复:
- 第一步:创建自增序列,最大值覆盖所有4位36进制的取值范围,开缓存提升生成效率
CREATE SEQUENCE seq_alnum_4bit START WITH 0 INCREMENT BY 1 MAXVALUE 1679615 CACHE 1000 NOCYCLE;
- 第二步:创建数字转36进制的转换函数
CREATE OR REPLACE FUNCTION num_to_36base(p_num NUMBER) RETURN VARCHAR2 IS v_result VARCHAR2(4); v_temp NUMBER := p_num; v_digit NUMBER; BEGIN IF p_num <0 OR p_num >1679615 THEN RETURN NULL; END IF; FOR i IN 1..4 LOOP v_digit := MOD(v_temp, 36); v_result := CASE WHEN v_digit <10 THEN to_char(v_digit) ELSE chr(ascii('A')+v_digit-10) END || v_result; v_temp := FLOOR(v_temp /36); END LOOP; RETURN v_result; END; /
- 调用方式:执行
SELECT num_to_36base(seq_alnum_4bit.nextval) FROM dual即可得到下一个序列值,可直接作为字段默认值或者插入语句的取值。
注意事项
- 两种方案生成的序列默认均为大写格式,符合000A、000B的格式要求,若需要小写可在输出时加
lower()函数转换。 - 若生成条数超过1679616,需要延长序列长度或者调整字符集合(比如加入小写字母扩容到62进制)。
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

