现有一个6位字符串,每一位取值从0-9,A-Z 共可以取 36的6次方。
现在我想做一个方法来实现这个功能,每次加一
例如0000->0001...->0009->000A...000Z->0010->...->ZZZZ
看上去是个36进制的问题,我想用pl/sql写,不知道应该怎么写。

解决方案 »

  1.   

    SQL> create or replace function f_36(vin number) return varchar2
      2  as
      3  vtemp number;
      4  vout varchar2(20);
      5  c varchar2(10);
      6  begin
      7   vtemp:=vin;
      8   if vtemp<36 then
      9     if vtemp<=9 then
     10        return vtemp;
     11     else
     12        return chr(vtemp+55);
     13     end if;
     14   end if;
     15   while vtemp>=36 loop
     16     c:=mod(vtemp,36);
     17     if c>9 then
     18        c:=chr(c+55);
     19     end if;
     20     vout:=vout||c;
     21     vtemp:=trunc(vtemp/36);
     22   end loop;
     23   return vtemp||vout;
     24  end f_36;
     25  /函数已创建。已用时间:  00: 00: 00.70
    SQL> select f_36(rownum) from tt;F_36(ROWNUM)
    --------------------------------------------------------------------
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A
    BF_36(ROWNUM)
    --------------------------------------------------------------------
    C
    D
    E
    F
    G
    H
    I
    J
    K
    L
    MF_36(ROWNUM)
    --------------------------------------------------------------------
    N
    O
    P
    Q
    R
    S
    T
    U
    V
    W
    XF_36(ROWNUM)
    --------------------------------------------------------------------
    Y
    Z
    10
    11
    12
    13
    14
    15
    16
    17
    18F_36(ROWNUM)
    --------------------------------------------------------------------
    19
    1A
    1B
    1C
    1D
    1E
    1F
    1G
    1H
    1I
    1JF_36(ROWNUM)
    --------------------------------------------------------------------
    1K
    1L
    1M
    1N
    1O
    1P
    1Q
    1R
    1S
    1T
    1UF_36(ROWNUM)
    --------------------------------------------------------------------
    1V
    1W
    1X
    1Y
    1Z
    20
    21
    22
    23
    24
    25F_36(ROWNUM)
    --------------------------------------------------------------------
    26
    27
    28
    29
    2A
    2B
    2C
    2D
    2E
    2F
    2G
      

  2.   

    然后通过触发器 取到sequence的nextval的值,通过此函数进行转换
    :new.id:=f_36(seqname.nextval);
    即可。
      

  3.   


    bzszp(SongZip)方法真好,思路清晰,
    先建一个36进制的转换函数,进制的本质就是取整、取模运算的思想;
    后通过建一个序列,很好的解决了并发的问题!学习收藏之...
      

  4.   

    顺便帮助我一下:http://community.csdn.net/Expert/topic/4223/4223925.xml?temp=.4511225