Posted on
Sunday, July 09, 2006 10:35 PM
Posted on
Thursday, June 01, 2006 3:22 PM
Looking around on the web I have found numerous posts complaining about the lack of bitwise operators in Oracle. Although Oracle does not seem to directly support bitwise operations on number types it does have support for bitwise operations on the raw type via the utl_raw package. With a little bit of type manipulation it is relatively easy to leverage these routines for use with number types.
create or replace package K_NUMBER_UTIL is
function ToRaw(p_Value number) return raw;
function BitOr(p_Value1 number, p_Value2 number) return number;
function BitXor(p_Value1 number, p_Value2 number) return number;
function BitAnd(p_Value1 number, p_Value2 number) return number;
end K_NUMBER_UTIL;
/
create or replace package body K_NUMBER_UTIL is
RawToNumberFMT constant char(12) := 'XXXXXXXXXXXX';
NumberToRawFMT constant char(14) := 'FM' || RawToNumberFMT;
function ToRaw(p_Value number) return raw is
begin
return HexToRaw(To_Char(p_Value, NumberToRawFMT));
end;
function BitOr(p_Value1 number, p_Value2 number) return number is
begin
return To_Number(utl_raw.bit_or(ToRaw(p_Value1), ToRaw(p_Value2)), RawToNumberFMT);
end;
function BitXor(p_Value1 number, p_Value2 number) return number is
begin
return To_Number(utl_raw.bit_xor(ToRaw(p_Value1), ToRaw(p_Value2)), RawToNumberFMT);
end;
function BitAnd(p_Value1 number, p_Value2 number) return number is
begin
return To_Number(utl_raw.bit_and(ToRaw(p_Value1), ToRaw(p_Value2)), RawToNumberFMT);
end;
end K_NUMBER_UTIL;
/