The Jonathan Lewis Pages

Decimal to Hex conversion function.


Somewhere in the $ORACLE_HOME/rdbms/admin set of scripts there is, I am sure, a little procedure of function to convert a decimal representation of a number into a Hexadecimal string. I haven't yet got around to looking for it, and over the years I've managed to do with by using a little PL/SQL routine.

I have just rewritten the routine as a packaged PL/SQl function, which can be called from SQL, although it is not intended to be terribly efficient (more a cute little example of recursion in PL/SQL) so should not be used for heavy-duty, high-speed processing.


rem
rem	Script:		jpl_utils.sql
rem	Author:		Jonathan Lewis
rem	Dated:		
rem	Purpose:	Set of odds and ends.
rem
rem	Notes:
rem	This version holds only a tested decimal to hex conversion function
rem	The function is declared as pure, and can be called from SQL.
rem
rem	The return is a string representing a HEX number up to 12 digits long
rem
rem	Sample of use:
rem		select jpl_utils.decimal_to_hex(99);
rem		execute dbms_output.put_line(jpl_utils.decimal_to_hex(127));
rem
create or replace package jpl_utils as
	function decimal_to_hex(i_decimal in integer) return varchar2;
	pragma restrict_references (decimal_to_hex, wnds, wnps, rnps);
end;
.
/
rem
rem	This isn't supposed to be an efficient high-volume
rem	function, just a cutesy little demo of recursive PL/SQL
rem	There is NO eror trapping
rem
create or replace package body jpl_utils as
function decimal_to_hex (i_decimal in integer)
return varchar2 is
	v_result	varchar2(12);
	v_hex_digit	varchar2(1);
	v_quotient	integer;
	v_remainder	integer;
begin
	if (i_decimal < 10) then
		v_result := to_char(i_decimal);
	elsif (i_decimal < 16) then
		v_result := chr(65+(i_decimal-10));   -- or 55 + idec
	else
		v_remainder := mod(i_decimal,16);
		v_quotient  := round((i_decimal - v_remainder) /16);
		v_result := 
			jpl_utils.decimal_to_hex(v_quotient) ||
			jpl_utils.decimal_to_hex(v_remainder);
	end if;
	return v_result;	
end  decimal_to_hex;
end jpl_utils;
.
/

Back to Main Index of Topics