蝶舞英心 2022-08-05 18:25 采纳率: 100%
浏览 71
已结题

oracle 实现字母自增

在oracle数据库中,如何造一个序列,如何能生成000a,000b,000c… 00ab,00ac…

  • 写回答

4条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-08-09 14:31
    关注

    其实就是将字母映射到数字,但问题是,为什么你题目中还会出现0?这个是存在歧义的,
    比如,在'000z'之后,是'00a0'还是'00aa'?
    也就是说,先要确定你的进制,是二十六进制还是二十七进制,即a表示的是0还是1?
    下面这个例子是27进制的,即把 0/a/b/c..z 这27个字符映射到 0/1/2..26 这27个数字上去

    --创建一个数字自增序列
    create sequence test_seq_alpha
    minvalue 1
    maxvalue 99999999999
    start with 1
    increment by 1
    order;
    --创建一个函数,将序列转换成自定义的二十七进制字符串
    create or replace function get_next_alpha_seq return varchar2 is
      next_num number;
      type arr is table of number index by pls_integer;
      obj arr;
      r   varchar2(4);
    begin
      select test_seq_alpha.nextval into next_num from dual;
      declare
        i number := 1;
      begin
        loop
          obj(i) := (next_num mod 27) + 96;
          next_num := trunc(next_num / 27);
          if next_num <= 26 then
            obj(i + 1) := next_num + 96;
            exit;
          end if;
          i:=i+1;
        end loop;
      end;
      for i in reverse 1 .. obj.count loop
        r := r || replace(chr(obj(i)),chr(96),'0');
      end loop;
      return lpad(r, 4, '0');
    end;
    /
    --使用这个函数,获得字母自增
    select get_next_alpha_seq from dual;
    

    另外一种方式就是建个表来存,每次查一下表,加1,但同样会遇到用二十六进制还是二十七进制的问题。
    而我这个代码则不需要再建表,用oracle自带的序列进行存储即可.
    但需要注意的是,由于这段代码按题目要求限制了4位,那么最多只能输出 27的4次方个值,超过会报错,当然你可以修改一下字符长度和lpad补全的长度

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月4日
  • 已采纳回答 6月26日
  • 创建了问题 8月5日