Oracle Tips : Function Convert Binary, Octal, Decimal, Heximal

Oracle Tips : Function Convert Binary, Octal, Decimal, Heximal

วันนี้ขอนำเสนอฟังก์ชันที่ช่วยในเรื่องคณิตศาสตร์ ให้เราคำนวนเปลี่ยนจากเลขฐาน 2,10, 16 ได้อย่างง่ายดาย เพียงสร้างฟังก์ชันดังนี้

create or replace function to_base( p_dec in number, p_base in number )return varchar2

is

      l_str varchar2(255) default NULL;

      l_num number      default p_dec;

      l_hex varchar2(16) default ‘0123456789ABCDEF’;

begin

      if ( p_dec is null or p_base is null )

      then

            return null;

      end if;

      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,p_base)+1, 1 ) || l_str;

            l_num := trunc( l_num/p_base );

            exit when ( l_num = 0 );

      end loop;

      return l_str;

end to_base;

/

 

 

create or replace function to_dec

( p_str in varchar2,

  p_from_base in number default 16 ) return number

is

      l_num   number default 0;

      l_hex   varchar2(16) default ‘0123456789ABCDEF’;

begin

      if ( p_str is null or p_from_base is null )

      then

            return null;

      end if;

      for i in 1 .. length(p_str) loop

            l_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1;

      end loop;

      return l_num;

end to_dec;

/

show errors

 

create or replace function to_hex( p_dec in number ) return varchar2

is

begin

      return to_base( p_dec, 16 );

end to_hex;

/

create or replace function to_bin( p_dec in number ) return varchar2

is

begin

      return to_base( p_dec, 2 );

end to_bin;

/

create or replace function to_oct( p_dec in number ) return varchar2

is

begin

      return to_base( p_dec, 8 );

end to_oct;

/

Test Function

เราจะลองทำการแปลงหมายเลข 10 (ฐาน10) ให้เป็น เลขฐาน 2,8,16 ดังนี้

SQL> select to_bin(10),to_oct(10),to_hex(10) from dual;

TO_BIN(10) TO_OCT(10) TO_HEX(10)
———- ———- ———-
1010       12         A

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *