求一个Function,用 0~9,A~F 这几个数字及字母,产生流水号,请大侠们帮助,急急急

时间:2021-08-29 19:55:19
求一个Function, 用 0~9,A~F  这几个数字及字母,产生流水号, 求各位帮助 ,产生的数据如下 格式:
00000,00001,00002,00003,00004,00005,00006,00007,00008,00009,0000A,0000B,0000C,0000D,0000E,0000F,00010....

6 个解决方案

#1


楼主啊 你的问题说白了不就是想生成一个五位的连续的十六进制数吗?

#2


给你个思路,先建一个序列,生成一个数字,然后把该数字转换成16进制的字符串,不够五位的话,前边补0.
下边是一个算法,你如果想建函数的话,变一下就可以
declare
  v_number number;
  v_length number;
  v_char   varchar2(10);
begin
  select mw_app.mwq_upc_struct.nextval into v_number from dual;
  select to_char(v_number, 'xxxxx') into v_char from dual;
  v_char   := trim(v_char);
  v_length := length(v_char);
  v_length := 5 - v_length;
  for i in 1 .. v_length loop
    v_char := '0' || v_char;
  end loop;
  dbms_output.put_line('五位的十六进制数为:' || v_char);
end;

#3


楼上的sequence可以实现,但会丢失号码,不能保证连续,却可保唯一,业务可以接受吗?

#4


基本如同三楼思路,代码如下:
1、创建SEQ,产生十进制的序列号:

CREATE SEQUENCE SEQ_HEX
MINVALUE 0
MAXVALUE 10000000
START WITH 0
INCREMENT BY 1
CACHE 20
CYCLE
ORDER;

2、写一个函数,返回0-9 A-F的结果:

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、程序中的调用:

SELECT  getHexSequence FROM dual;

4、产生的结果如下:

SQL> SELECT  getHexSequence FROM dual;

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

SQL>

#5


4楼正解。。

#6


4楼正解。。 

#1


楼主啊 你的问题说白了不就是想生成一个五位的连续的十六进制数吗?

#2


给你个思路,先建一个序列,生成一个数字,然后把该数字转换成16进制的字符串,不够五位的话,前边补0.
下边是一个算法,你如果想建函数的话,变一下就可以
declare
  v_number number;
  v_length number;
  v_char   varchar2(10);
begin
  select mw_app.mwq_upc_struct.nextval into v_number from dual;
  select to_char(v_number, 'xxxxx') into v_char from dual;
  v_char   := trim(v_char);
  v_length := length(v_char);
  v_length := 5 - v_length;
  for i in 1 .. v_length loop
    v_char := '0' || v_char;
  end loop;
  dbms_output.put_line('五位的十六进制数为:' || v_char);
end;

#3


楼上的sequence可以实现,但会丢失号码,不能保证连续,却可保唯一,业务可以接受吗?

#4


基本如同三楼思路,代码如下:
1、创建SEQ,产生十进制的序列号:

CREATE SEQUENCE SEQ_HEX
MINVALUE 0
MAXVALUE 10000000
START WITH 0
INCREMENT BY 1
CACHE 20
CYCLE
ORDER;

2、写一个函数,返回0-9 A-F的结果:

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、程序中的调用:

SELECT  getHexSequence FROM dual;

4、产生的结果如下:

SQL> SELECT  getHexSequence FROM dual;

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

SQL>

#5


4楼正解。。

#6


4楼正解。。