日期:2014-05-16  浏览次数:20472 次

产生十六进制的流水号

需求如下:

求一个Function, 用 0~9,A~F  这几个数字及字母,产生流水号,,产生的数据如下 格式:
00000,00001,00002,00003,00004,00005,00006,00007,00008,00009,0000A,0000B,0000C,0000D,0000E,0000F,00010....

解决如下:

1、新建产生十进制的序列号SEQ_HEX
CREATE SEQUENCE SEQ_HEX
MINVALUE 0
MAXVALUE 10000000
START WITH 0
INCREMENT BY 1
CACHE 20
CYCLE
ORDER;

2、写一个函数,函数的作用是返回十六进制的序列号

CREATE OR REPLACE FUNCTION getHexSequence
RETURN VARCHAR2
AS
    N_SHANG NUMBER(10);
    N_YUSHU NUMBER(10);
    HEXRES   VARCHAR2(10);
BEGIN
    N_SHANG :=seq_hex.NEXTVAL;
    IF N_SHANG = 0 THEN
          RETURN '00000';
    END IF;
    WHILE N_SHANG>0  LOOP
        N_YUSHU:=N_SHANG MOD 16;
        SELECT CONCAT(DECODE(N_YUSHU,'10','A','11','B','12','C','13','D','14','E','15','F',N_YUSHU),HEXRES) INTO HEXRES FROM DUAL;
        N_SHANG := TRUNC(N_SHANG/16);
    END LOOP;
    RETURN LPAD(HEXRES,5,0);
END;

3、在程序中调用,产生十六进制的序列号

SQL> SELECT  getHexSequence FROM dual;

GETHEXSEQUENCE
----------------------------------------
000AD

上述解决方法不一定是最优的,希望抛砖引玉,看有没有更好的解决方案。