Oracle 中的進制轉換

Oracle 中的進制轉換

1 進制名

進制 英文全名 縮寫
2 binary B
8 octal O
10 Decimal D
16 hexadecimal H

2 10進制與16進制互相轉換

2.1 10進制轉換爲16進制

10 進制轉換爲16進制是經過to_char 來實現的: css

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來實現: html

  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進制的轉換 java

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進制的函數,不過能夠本身寫,下面是偷的別人的, python

   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.csdn.net/java3344520/article/details/6684814 sql

  • 示例 shell

         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.leesass

Created: 2019-07-28 Sun 19:47ruby

Validatebash

相關文章
相關標籤/搜索