熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在Oracle中實現數字進制轉換完全版

2013-11-13 22:10:44  來源: Oracle 

  以下內容包括
  提供兩個進制轉換包
  提供進制轉換的一些簡便方法
  提供進制轉換的不同方法的性能評估
  兩個進制轉換包
  )包PKG_DM_BASE_CONV(推薦)
  CREATE OR REPLACE PACKAGE PKG_DM_BASE_CONV AS
  FUNCTION hex_to_dec (hexnum IN char) RETURN NUMBER;
  PRAGMA restrict_references (HEX_TO_DECWNDS); 
   
  FUNCTION dec_to_hex (N IN NUMBER) RETURN VARCHAR;
  PRAGMA restrict_references (DEC_TO_HEXWNDS);
   
  FUNCTION oct_to_dec (octin IN NUMBER) RETURN NUMBER;
  PRAGMA restrict_references (OCT_TO_DECWNDS);
   
  FUNCTION dec_to_oct (decin IN NUMBER) RETURN VARCHAR;
  PRAGMA restrict_references (DEC_TO_OCTWNDS);
   
  FUNCTION bin_to_dec (binin IN NUMBER) RETURN NUMBER;
  PRAGMA restrict_references (BIN_TO_DECWNDS);
   
  FUNCTION dec_to_bin (decin IN NUMBER) RETURN VARCHAR;
  PRAGMA restrict_references (DEC_TO_BINWNDS);
   
  FUNCTION hex_to_bin (hexin IN VARCHAR) RETURN NUMBER;
  PRAGMA restrict_references (HEX_TO_BINWNDS);
   
  FUNCTION bin_to_hex (binin IN NUMBER) RETURN VARCHAR;
  PRAGMA restrict_references (BIN_TO_HEXWNDS);
   
  FUNCTION oct_to_bin (octin IN NUMBER) RETURN NUMBER;
  PRAGMA restrict_references (OCT_TO_BINWNDS);
   
  FUNCTION bin_to_oct (binin IN NUMBER) RETURN NUMBER;
  PRAGMA restrict_references (BIN_TO_OCTWNDS);
   
  FUNCTION oct_to_hex (octin IN NUMBER) RETURN VARCHAR;
  PRAGMA restrict_references (OCT_TO_HEXWNDS);
   
  FUNCTION hex_to_oct (hexin IN VARCHAR) RETURN NUMBER;
  PRAGMA restrict_references (HEX_TO_OCTWNDS);
   
  十六進制字符轉換成ASCII碼字符
  FUNCTION raw_to_char(v_raw LONG RAW) RETURN VARCHAR;
  PRAGMA restrict_references (raw_to_charWNDS);
   
  ASCII碼字符轉換成十六進制字符 
  FUNCTION char_to_raw(v_char varchar) RETURN LONG RAW;
  PRAGMA restrict_references (char_to_rawWNDS); 
   
  END PKG_DM_BASE_CONV;
  /
  CREATE OR REPLACE PACKAGE BODY PKG_DM_BASE_CONV AS
   
  FUNCTION hex_to_dec (hexnum in char) RETURN NUMBER IS
     i         NUMBER;
     digits      NUMBER;
     result      NUMBER := ;
     current_digit   char();
     current_digit_dec number;
  BEGIN
     digits := length(hexnum);
     FOR i IN digits LOOP
       current_digit := SUBSTR(hexnum i );
       IF current_digit IN (ABCDEF) THEN
         current_digit_dec := ascii(current_digit) ascii(A) + ;
       ELSE
         current_digit_dec := to_number(current_digit);
       END IF;
       result := (result * ) + current_digit_dec;
     END LOOP;
     RETURN result;
  END hex_to_dec;
   
  FUNCTION dec_to_hex (N IN NUMBER) RETURN VARCHAR IS
     H VARCHAR() :=;
     N INTEGER   := N;
  BEGIN
     LOOP
       SELECT rawtohex(chr(N))||H
        INTO H
        FROM dual;
   
       N := trunc(N / );
       EXIT WHEN N=;
     END LOOP;
     RETURN H;
  END dec_to_hex;
   
  FUNCTION oct_to_dec (octin IN NUMBER) RETURN NUMBER IS
  v_charpos NUMBER;
  v_charval CHAR();
  v_return NUMBER DEFAULT ;
  v_power NUMBER DEFAULT ;
  v_string VARCHAR();
  BEGIN
  v_string := TO_CHAR(octin);
  v_charpos := LENGTH(v_string);
  WHILE v_charpos > LOOP
  v_charval := SUBSTR(v_stringv_charpos);
  IF v_charval BETWEEN AND THEN
  v_return := v_return + TO_NUMBER(v_charval) * POWER(v_power);
  ELSE
  raise_application_error(Invalid input);
  END IF;
  v_charpos := v_charpos ;
  v_power := v_power + ;
  END LOOP;
  RETURN v_return;
  END oct_to_dec;
   
  FUNCTION dec_to_oct (decin IN NUMBER) RETURN VARCHAR IS
  v_decin NUMBER;
  v_next_digit NUMBER;
  v_result varchar();
  BEGIN
  v_decin := decin;
  WHILE v_decin > LOOP
  v_next_digit := mod(v_decin);
  v_result := to_char(v_next_digit) || v_result;
  v_decin := floor(v_decin / );
  END LOOP;
  RETURN v_result;
  END dec_to_oct;
   
  FUNCTION bin_to_dec (binin IN NUMBER) RETURN NUMBER IS
  v_charpos NUMBER;
  v_charval CHAR();
  v_return NUMBER DEFAULT ;
  v_power NUMBER DEFAULT ;
  v_string VARCHAR();
  BEGIN
  v_string := TO_CHAR(binin);
  v_charpos := LENGTH(v_string);
  WHILE v_charpos > LOOP
  v_charval := SUBSTR(v_stringv_charpos);
  IF v_charval BETWEEN AND THEN
  v_return := v_return + TO_NUMBER(v_charval) * POWER(v_power);
  ELSE
  raise_application_error(Invalid input);
  END IF;
  v_charpos := v_charpos ;
  v_power := v_power + ;
  END LOOP;
  RETURN v_return;
  END bin_to_dec;
   
  FUNCTION dec_to_bin (decin IN NUMBER) RETURN VARCHAR IS
  v_decin NUMBER;
  v_next_digit NUMBER;
  v_result varchar();
  BEGIN
  v_decin := decin;
  WHILE v_decin > LOOP
  v_next_digit := mod(v_decin);
  v_result := to_char(v_next_digit) || v_result;
  v_decin := floor(v_decin / );
  END LOOP;
  RETURN v_result;
  END dec_to_bin;
   
  FUNCTION hex_to_bin (hexin IN VARCHAR) RETURN NUMBER IS
  BEGIN
  RETURN dec_to_bin(hex_to_dec(hexin));
  END hex_to_bin;
   
  FUNCTION bin_to_hex (binin IN NUMBER) RETURN VARCHAR IS
  BEGIN
  RETURN dec_to_hex(bin_to_dec(binin));
  END bin_to_hex;
   
  FUNCTION oct_to_bin (octin IN NUMBER) RETURN NUMBER IS
  BEGIN
  RETURN dec_to_bin(oct_to_dec(octin));
  END oct_to_bin;
   
  FUNCTION bin_to_oct (binin IN NUMBER) RETURN NUMBER IS
  BEGIN
  RETURN dec_to_oct(bin_to_dec(binin));
  END bin_to_oct;
   
  FUNCTION oct_to_hex (octin IN NUMBER) RETURN VARCHAR IS
  BEGIN
  RETURN dec_to_hex(oct_to_dec(octin));
  END oct_to_hex;
   
  FUNCTION hex_to_oct (hexin IN VARCHAR) RETURN NUMBER IS
  BEGIN
  RETURN dec_to_oct(hex_to_dec(hexin));
  END hex_to_oct;
   
  FUNCTION raw_to_char(v_raw LONG RAW) RETURN VARCHAR IS
     rawlen    NUMBER;
     hex     VARCHAR();
     rawparam   VARCHAR();
     i      NUMBER;
  BEGIN
     hex := rawtohex(v_raw);
     rawlen := length(hex);
     i := ;
     WHILE i <= rawlen 
      LOOP
       rawparam := rawparam||CHR(hex_to_dec(substrb(hexi)));
       i := i + ;
      END LOOP;
   
     RETURN rawparam;
  END raw_to_char;
    
   
  FUNCTION char_to_raw(v_char varchar) RETURN LONG RAW IS
     rawdata   LONG RAW;
     rawlen    NUMBER;
     hex     VARCHAR();
     i      NUMBER;
    BEGIN
     rawlen := length(v_char);
     i := ;
     WHILE i <= rawlen 
      LOOP
       hex := dec_to_hex(ascii(substrb(v_chari)));
       rawdata := rawdata || HEXTORAW(hex);
       i := i + ;
      END LOOP;
   
     RETURN rawdata;
     
  END;
   
  END PKG_DM_BASE_CONV;
  /
   

From:http://tw.wingwit.com/Article/program/Oracle/201311/18388.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.