有时为了方便表示数字,用16进制更直观,比如C语言里用0xFF这样表示16进制数,ORACLE中有没有相应的表示方法?注意我不是要什么进制转换函数,简单的表示符号而已,有没有?

解决方案 »

  1.   

    select to_char(17,'xxx') from dual;
    这能转,但不是你要的效果
      

  2.   


     select to_char(17,'xxx')from dual;
     
    TO_CHAR(17,'XXX')
    -----------------
      1111当然不能表示17在oracle中,因此要调整进制模式,如下:CREATE OR REPLACE PROCEDURE dec2hex (in_num IN NUMBER, out_hex OUT VARCHAR2)
      IS
        TYPE vc2tab_type IS TABLE OF VARCHAR2(1)
         INDEX BY BINARY_INTEGER;
      
        hextab            vc2tab_type;
        v_num             NUMBER;
        v_hex             VARCHAR2(200);
      
      /*
      Author: Jonas Nordstrom
      */
      BEGIN
        IF in_num IS NULL THEN RETURN NULL; END IF; 
      
        hextab (0) := '0';
        hextab (1) := '1';
        hextab (2) := '2';
        hextab (3) := '3';
        hextab (4) := '4';
        hextab (5) := '5';
        hextab (6) := '6';
        hextab (7) := '7';
        hextab (8) := '8';
        hextab (9) := '9';
        hextab (10) := 'A';
        hextab (11) := 'B';
        hextab (12) := 'C';
        hextab (13) := 'D';
        hextab (14) := 'E';
        hextab (15) := 'F';
        v_num := in_num;
      
        WHILE v_num >= 16
        LOOP
         v_hex := hextab (MOD (v_num, 16)) v_hex;
         v_num := TRUNC (v_num / 16);
        END LOOP;
      
        v_hex := hextab (MOD (v_num, 16)) v_hex;
        out_hex := v_hex;
      END;  -- dec2hex
      /
      
      CREATE OR REPLACE FUNCTION hextointeger (h VARCHAR2)
        RETURN PLS_INTEGER
      IS
      BEGIN
        IF NVL (LENGTH (h), 1) = 1
        THEN
         RETURN INSTR ('0123456789ABCDEF', h) - 1;
        ELSE
         RETURN 16 * hextointeger (SUBSTR (h, 1, LENGTH (h) - 1)) +
             INSTR ('0123456789ABCDEF', SUBSTR (h, -1)) -
             1;
        END IF;
      END hextointeger;
      /
      
      CREATE OR REPLACE FUNCTION integertohex (n pls_integer)
        RETURN VARCHAR2
      IS
      BEGIN
        IF n > 0
        THEN
         RETURN integertohex (TRUNC (n / 16))
             SUBSTR ('0123456789ABCDEF', MOD (n, 16) + 1, 1);
        ELSE
         RETURN NULL;
        END IF;
      END integertohex;
      /