SELECT TO_NUMBER('19F', 'XXX') FROM DUAL; -- 415
SELECT TO_NUMBER('F', 'XX') FROM DUAL; -- 15
格式模型 X/XX/XXX 對應 1-3 位十六進制數字,不區分大小寫。
SELECT TO_CHAR(123, 'XXX') FROM DUAL; -- 7B
SELECT TO_CHAR(4567, 'XXXX') FROM DUAL; -- 11D7
模型長度決定輸出位數,不足前導補零。
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),最高位在前,支援任意位寬。
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
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 快速組合標誌位);DETERMINISTIC 聲明利用結果緩存;UTL_RAW.CAST_TO_NUMBER 等底層包處理原始字節轉換。掌握內建與自定義雙軌方案,靈活應對從簡單報表到複雜編解碼的全谱系進制轉換需求。