Reputation: 61695
How do I convert hexadecimal to decimal (and back again) using Oracle SQL?
Upvotes: 30
Views: 115216
Reputation: 1
CREATE OR REPLACE FUNCTION HEXTODEC (p_hexadecimal IN varchar2 default '0') RETURN varchar2
IS
v__power INTEGER := 0;
v__hex_number INTEGER;
v__length NUMBER;
v__place_value VARCHAR2(100);
v__multiply NUMBER;
v__decimal number := 0;
v__decimalEEEE LONG;
BEGIN
SELECT LENGTH(UPPER(p_hexadecimal))
INTO v__length
FROM dual;
FOR i IN 1..v__length
LOOP
SELECT POWER(16,v__power)
INTO v__hex_number
FROM dual;
v__power := v__power + 1;
FOR j IN 1..v__length LOOP
CONTINUE WHEN i > j;
IF i = j THEN
SELECT DECODE(SUBSTR(SUBSTR(UPPER(p_hexadecimal), -j,j),1,1),'0',0,'1',1,'2',2,'3',3,'4',4,'5',5,'6',6,'7',7,'8',8,'9',9,'A',10,'B',11,'C',12,'D',13,'E',14,'F',16 ,NULL)
INTO v__place_value
FROM DUAL;
v__multiply := v__place_value * v__hex_number;
v__decimal := NVL(v__multiply,0)+ NVL(v__decimal,0);
END IF;
END LOOP;
END LOOP;
RETURN (v__decimal);
EXCEPTION
WHEN OTHERS THEN
SELECT TO_CHAR(v__decimal,'9.9EEEE')
INTO v__decimalEEEE
FROM DUAL;
RETURN v__decimalEEEE;
END;
/
Upvotes: 0
Reputation: 146
Even though the 'X' option of to_number and to_char have been available for a very long time, they still don't seem to appear in Oracle documentation.
In addition to converting to and from hexadecimal, it is sometimes desirable to convert to and from binary or even octal. Oracle does not provide anything for that that I am aware of.
I found this thread while searching to see if Oracle has yet added a built in method to convert to/from binary, but it seems that still is not available
Quite some time ago I wrote a PL/SQL package 'Radix' that can be used to convert between various formats.
The following demo SQL:
select radix.to_hex(285) from dual;
select radix.to_dec('11D', 16) from dual;
select radix.to_bin(255) from dual;
select radix.to_bin(256) from dual;
Produced these results:
RADIX.TO_HEX(285)
----------------------------------------
11D
RADIX.TO_DEC('11D',16)
----------------------
285
RADIX.TO_BIN(255)
----------------------------------------
11111111
RADIX.TO_BIN(256)
----------------------------------------
100000000
The code is open source (MIT License) , and available here if interested:
Upvotes: 1
Reputation: 8992
If you are using 8.1.5 and above you can use:
To convert from hexadecimal to decimal:
select to_number('AA', 'xx') from dual;
To convert from decimal to hexadecimal:
select to_char(111, 'xxxx') from dual;
Upvotes: 45
Reputation: 37205
Starting in Oracle8i, the TO_CHAR and TO_NUMBER functions can handle conversions from base 10 (decimal) to base 16 (hexadecimal) and back again:
SQL> select to_char(123,'XX') to_hex,
2 to_number('7B','XX') from_hex
3 from dual
4 /
TO_ FROM_HEX
------ -----------------
7B 123
Upvotes: 6
Reputation: 425341
SELECT TO_NUMBER('DEADBEEF', 'XXXXXXXX')
FROM dual
---
3735928559
SELECT TO_CHAR(3735928559, 'XXXXXXXX')
FROM dual
---
DEADBEEF
Upvotes: 13
Reputation: 6366
FTA: Oracle to Decimal :
CREATE OR REPLACE FUNCTION hex2dec (hexnum IN CHAR) RETURN NUMBER IS
i NUMBER;
digits NUMBER;
result NUMBER := 0;
current_digit CHAR(1);
current_digit_dec NUMBER;
BEGIN
digits := LENGTH(hexnum);
FOR i IN 1..digits LOOP
current_digit := SUBSTR(hexnum, i, 1);
IF current_digit IN ('A','B','C','D','E','F') THEN
current_digit_dec := ASCII(current_digit) - ASCII('A') + 10;
ELSE
current_digit_dec := TO_NUMBER(current_digit);
END IF;
result := (result * 16) + current_digit_dec;
END LOOP;
RETURN result;
END hex2dec;
/
show errors
CREATE OR REPLACE FUNCTION num2hex (N IN NUMBER) RETURN VARCHAR2 IS
H VARCHAR2(64) :='';
N2 INTEGER := N;
BEGIN
LOOP
SELECT RAWTOHEX(CHR(N2))||H
INTO H
FROM dual;
N2 := TRUNC(N2 / 256);
EXIT WHEN N2=0;
END LOOP;
RETURN H;
END num2hex;
/
show errors
Upvotes: 1