DS's『 행복합시다 』

Carpe Programming/oracle

[oracle] 진수 변환

nolite 2012. 2. 16. 17:23


가끔 SQL 문에서 진수 변환을 하고 싶은 경우가 있어 만들어 놓은 함수입니다..

CREATE OR REPLACE FUNCTION SF_CVT_DEC2HEXA
(
I_N_DEC IN NUMBER, // 입력값
I_N_MODE IN NUMBER, // 변환할 진수
I_N_LEN IN NUMBER // 리턴될 자릿수
) RETURN VARCHAR2 IS
S_TRANS VARCHAR2(32) := '0123456789ABCDEFGHIJKLMNOPQRSTUV';
S_HEXACHAR VARCHAR2(32) := '';
N_MODE NUMBER(2) := 2;
N_MOK NUMBER(10) := 0;
N_REM NUMBER(10) := 0;
BEGIN

N_MOK := I_N_DEC;
N_MODE := I_N_MODE;

CASE N_MODE
WHEN 2 THEN
N_MODE := I_N_MODE;
WHEN 8 THEN
N_MODE := I_N_MODE;
WHEN 16 THEN
N_MODE := I_N_MODE;
WHEN 32 THEN
N_MODE := I_N_MODE;
ELSE
N_MODE := 2;
END CASE;

LOOP
N_REM := MOD(N_MOK, N_MODE);
S_HEXACHAR := SUBSTRB(S_TRANS,N_REM+1,1) || S_HEXACHAR;
N_MOK := TRUNC(N_MOK / N_MODE,0);
IF N_MOK = 0 THEN
EXIT;
END IF;
END LOOP;

IF LENGTH(S_HEXACHAR) < I_N_LEN THEN
S_HEXACHAR := LPAD(S_HEXACHAR, I_N_LEN,'0');
ELSE
S_HEXACHAR := SUBSTRB(S_HEXACHAR , -1 * I_N_LEN, I_N_LEN );
END IF;

RETURN S_HEXACHAR;

EXCEPTION
WHEN OTHERS THEN
RETURN SQLERRM;
END SF_CVT_DEC2HEXA;

32진수 까지 됩니다..

728x90