ORACLE十進制向任何多種進制轉化

以下ORACLE十進制向任何多種進制轉化的函數

P_DEC  是一個十進制的數.如(100)

P_DEFINE 定義進制中所包含的字符(1234567}ABCDEF}RST)這個數有種進制組成,

如果只有一種則(1234567890ABCDEFG)。

 

FUNCTION TO_BASE( P_DEC IN NUMBER,P_DEFINE IN VARCHAR2)


 RETURN VARCHAR2
  IS
  L_STR VARCHAR2(255) DEFAULT NULL;
  L_NUM NUMBER DEFAULT P_DEC;
  L_HEX VARCHAR2(360) DEFAULT P_DEFINE;
  TEMP VARCHAR2(360);
  CNT NUMBER;
  DIV NUMBER;
   BEGIN
 --  FOR I IN 1..50-LENGTH(P_DEFINE) LOOP
 --  L_HEX:=L_HEX||'0';
 -- END LOOP;
   IF INSTR(P_DEFINE,'}')>0 THEN
     L_HEX:=L_HEX||'}';
     CNT:=1;
     LOOP
      TEMP:=SUBSTR(L_HEX,0,INSTR(L_HEX,'}')-1);
      L_HEX:=SUBSTR(L_HEX,INSTR(L_HEX,'}')+1,LENGTH(L_HEX)-INSTR(L_HEX,'}')) ;
      CNT:=CNT*LENGTH(TEMP);
      EXIT WHEN (INSTR(L_HEX,'}')=0 OR L_HEX IS NULL);
     END LOOP;
      IF CNT<=L_NUM THEN
      RETURN 'ERR';
      END IF;
      L_HEX:='0}'||P_DEFINE||'}';
      LOOP
    
      TEMP:=SUBSTR(L_HEX,0,INSTR(L_HEX,'}')-1);
      L_HEX:=SUBSTR(L_HEX,INSTR(L_HEX,'}')+1,LENGTH(L_HEX)-INSTR(L_HEX,'}')) ;
      IF TEMP <>'0' THEN
      CNT:=CNT/LENGTH(TEMP);
      END IF;
    
      DIV:= TRUNC( L_NUM/CNT );
      L_NUM:=L_NUM-DIV*CNT;
      L_STR:=L_STR||SUBSTR( TEMP, DIV+1, 1 );
      EXIT WHEN (INSTR(L_HEX,'}')=0 OR L_HEX IS NULL);
     END LOOP;
  
   ELSE
     IF ( TRUNC(P_DEC) <> P_DEC OR P_DEC < 0 ) THEN
     RAISE PROGRAM_ERROR;
     END IF;
      LOOP
        L_STR := SUBSTR( L_HEX, MOD(L_NUM,LENGTH(P_DEFINE))+1, 1 ) || L_STR;
        L_NUM := TRUNC( L_NUM/LENGTH(P_DEFINE) );
      EXIT WHEN ( L_NUM = 0 );
      END LOOP;
    END IF;
    SELECT DECODE(SUBSTR(L_STR,1,1),'0',SUBSTR(L_STR,2,LENGTH(L_STR)-1),L_STR) INTO L_STR  FROM DUAL;
    RETURN  L_STR;
    END TO_BASE;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值