首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 進制轉換完全指南:內建函數與自定義實現

     編輯:Oracle 資料庫基礎

一、十六進制 → 十進制:TO_NUMBER

SELECT TO_NUMBER('19F', 'XXX') FROM DUAL;  -- 415
SELECT TO_NUMBER('F', 'XX') FROM DUAL;     -- 15

格式模型 X/XX/XXX 對應 1-3 位十六進制數字,不區分大小寫。

二、十進制 → 十六進制:TO_CHAR

SELECT TO_CHAR(123, 'XXX') FROM DUAL;   -- 7B
SELECT TO_CHAR(4567, 'XXXX') FROM DUAL; -- 11D7

模型長度決定輸出位數,不足前導補零。

三、二進制 → 十進制:BIN_TO_NUM (9i+)

SELECT BIN_TO_NUM(1,1,0,1) FROM DUAL;   -- 13
SELECT BIN_TO_NUM(1,0) FROM DUAL;       -- 2
SELECT BIN_TO_NUM(1,1,1,0,1) FROM DUAL; -- 29

參數為各位元值(0/1),最高位在前,支援任意位寬。

四、通用進制互轉:自定義函數 (來源 AskTom)

十進制 → 任意進制 (2-16)

CREATE OR REPLACE FUNCTION to_base(p_dec IN NUMBER, p_base IN NUMBER)
RETURN VARCHAR2 IS
    l_str VARCHAR2(255) DEFAULT NULL;
    l_num NUMBER := p_dec;
    l_hex VARCHAR2(16) := '0123456789ABCDEF';
BEGIN
    IF TRUNC(p_dec) != p_dec OR p_dec < 0 THEN
        RAISE PROGRAM_ERROR;
    END IF;
    LOOP
        l_str := SUBSTR(l_hex, MOD(l_num, p_base) + 1, 1) || l_str;
        l_num := TRUNC(l_num / p_base);
        EXIT WHEN l_num = 0;
    END LOOP;
    RETURN l_str;
END to_base;
/
-- 測試
SELECT to_base(255, 16) FROM DUAL;  -- FF
SELECT to_base(255, 2)  FROM DUAL;  -- 11111111
SELECT to_base(255, 8)  FROM DUAL;  -- 377

任意進制 (2-16) → 十進制

CREATE OR REPLACE FUNCTION to_dec(p_str IN VARCHAR2, p_from_base IN NUMBER DEFAULT 16)
RETURN NUMBER IS
    l_num NUMBER := 0;
    l_hex VARCHAR2(16) := '0123456789ABCDEF';
BEGIN
    FOR i IN 1..LENGTH(p_str) LOOP
        l_num := l_num * p_from_base + INSTR(l_hex, UPPER(SUBSTR(p_str, i, 1)));
    END LOOP;
    RETURN l_num;
END to_dec;
/
-- 測試
SELECT to_dec('FF', 16) FROM DUAL;       -- 255
SELECT to_dec('11111111', 2) FROM DUAL;  -- 255
SELECT to_dec('377', 8) FROM DUAL;       -- 255

五、實戰應用場景

  • 權限位掩碼運算(BIN_TO_NUM 快速組合標誌位);
  • 加密/雜湊值十六進制顯示與存儲轉換;
  • 異構系統數據交換格式適配(如主機十六進制 ↔ 開放系統十進制);
  • 自定義進制編碼方案(Base32、Base58 等擴展)。

六、性能與避坑提示

  1. 內建函數優於自定義函數(SQL 引擎內部優化、無上下文切換);
  2. 大批量轉換時,考慮 DETERMINISTIC 聲明利用結果緩存;
  3. 輸入驗證:非法字符、超出進制範圍、負數處理;
  4. 12c+ 可用 UTL_RAW.CAST_TO_NUMBER 等底層包處理原始字節轉換。

掌握內建與自定義雙軌方案,靈活應對從簡單報表到複雜編解碼的全谱系進制轉換需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved