Oracle 中的進制轉換
Table of Contents
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