You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:24:03