Oracle 中的进制转换

本文详细介绍了Oracle数据库中不同进制之间的转换方法,包括10进制与16进制、2进制与10进制的互相转换。提供了具体的SQL语句示例,如使用to_char将10进制转换为16进制,使用to_number进行逆向转换,以及自定义函数实现10进制到2进制的转换。
<?xml version="1.0" encoding="utf-8"?> Oracle 中的进制转换

Oracle 中的进制转换

1 进制名

进制英文全名缩写
2binaryB
8octalO
10DecimalD
16hexadecimalH

2 10进制与16进制互相转换

2.1 10进制转换为16进制

10 进制转换为16进制是通过to_char 来实现的:

SQL> col hex for a20
SQL> select trim(to_char(109834,'xxxxxx')) as hex from dual;

HEX
--------------------
1ad0a

2.2 16进制转换为10进制

16进制转换为10进制可以通过to_number来实现:

  SQL> col dec for 999999
SQL> select to_number('1ad0a','xxxxxxxx') as dec from dual;

    DEC
-------
 109834

3 2进制与10进制互相转换

3.1 2进制转10进制

从Oracle9i开始,提供函数bin_to_num进行2进制到10进制的转换

SQL> select bin_to_num(1,0,1,0,1,1) from dual;

BIN_TO_NUM(1,0,1,0,1,1)
-----------------------
                     43

3.2 10进制转2进制

oracle 没有提供10进制转2进制的函数,不过可以自己写,下面是偷的别人的,

   CREATE OR REPLACE FUNCTION NUM_to_BIn(V_NUM NUMBER) RETURN VARCHAR IS
  V_RTN VARCHAR(2000);
  V_N1  NUMBER;
  V_N2  NUMBER;
BEGIN
  V_N1 := ABS(V_NUM);
  --如果为正数
  IF SIGN(V_NUM) > 0 THEN
    LOOP
      V_N2  := MOD(V_N1, 2);
      V_N1  := ABS(TRUNC(V_N1 / 2));
      V_RTN := TO_CHAR(V_N2) || V_RTN;
      EXIT WHEN V_N1 = 0;
    END LOOP;

    --dbms_output.put_line('正数结果'||V_RTN);

    --补全32位高位0
    SELECT lpad(V_RTN,32,0)
    INTO   V_RTN
    FROM dual;

     --dbms_output.put_line('正数补全结果'||V_RTN);

  ELSE
    --转换为二进制同时按位取反
    LOOP
      V_N2 := MOD(V_N1, 2);
      IF V_N2 = 1 THEN
        V_N2 := 0;
      ELSIF V_N2 = 0 THEN
        V_N2 := 1;
      END IF;
      V_N1  := ABS(TRUNC(V_N1 / 2));
      V_RTN := TO_CHAR(V_N2) || V_RTN;
      EXIT WHEN V_N1 = 0;
    END LOOP;

    --dbms_output.put_line('负数结果'||V_RTN);

    --补全32位高位1
    SELECT lpad(V_RTN,32,1)
    INTO   V_RTN
    FROM dual;

    --dbms_output.put_line('负数补全1结果'||V_RTN);

    --二进制转换为10机制,同时+1
    SELECT SUM(data1) + 1
    INTO V_N1
      FROM (SELECT substr(V_RTN, rownum, 1) * power(2, length(V_RTN) - rownum) data1
              FROM dual
            CONNECT BY rownum <= length(V_RTN));

    -- dbms_output.put_line('转换为十进制数结果'||V_RTN);

    ----转换为二进制
    LOOP
      V_N2 := MOD(V_N1, 2);
      V_N1  := ABS(TRUNC(V_N1 / 2));
      V_RTN := TO_CHAR(V_N2) || V_RTN;
      EXIT WHEN V_N1 = 0;
    END LOOP;

    --dbms_output.put_line('负数转换结果'||V_RTN);

    --补全32位高位0
    SELECT lpad(V_RTN,32,0)
    INTO   V_RTN
    FROM dual;

    --dbms_output.put_line('负数补全0结果'||V_RTN);

  END IF;

  RETURN V_RTN;
END;
/

原网页如下: https://blog.youkuaiyun.com/java3344520/article/details/6684814

  • 示例

         SQL> select num_to_bin(-1) from dual;
    
    NUM_TO_BIN(-1)
    --------------------------------------------------------------------------------
    11111111111111111111111111111111
    
    SQL> select num_to_bin(1) from dual;
    
    NUM_TO_BIN(1)
    --------------------------------------------------------------------------------
    00000000000000000000000000000001
    

Author: halberd.lee

Created: 2019-07-28 Sun 19:47

Validate

转载于:https://www.cnblogs.com/halberd-lee/p/11259125.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值