以下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;