近日,用到将数据库中十进制转二进制然后进行判断某一位是1还是0,然后显示设备的不同状态。
找到以下函数,记录一下。
CREATE OR REPLACE EDITIONABLE FUNCTION NUM_TO_BIT (V_NUM NUMBER) RETURN VARCHAR ISV_RTN VARCHAR(2000);V_N1 NUMBER;V_N2 NUMBER;BEGINV_N1 := ABS(V_NUM);-- 如果为正数IF SIGN(V_NUM) > 0 THENLOOPV_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;-- 补全32位高位0SELECT lpad(V_RTN,32,0)INTO V_RTNFROM dual;ELSE-- 转换为二进制同时按位取反LOOPV_N2 := MOD(V_N1, 2);IF V_N2 = 1 THENV_N2 := 0;ELSIF V_N2 = 0 THENV_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;-- 补全32位高位1SELECT lpad(V_RTN,32,1)INTO V_RTNFROM dual;-- 二进制转换为10机制,同时+1SELECT SUM(data1) + 1INTO V_N1FROM (SELECT substr(V_RTN, rownum, 1) * power(2, length(V_RTN) - rownum) data1FROM dual CONNECT BY rownum <= length(V_RTN));-- 转换为二进制LOOPV_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;-- 补全32位高位0SELECT lpad(V_RTN,32,0)INTO V_RTNFROM dual;END IF;RETURN V_RTN;END;
文章出自:https://blog.csdn.net/java3344520/article/details/6684814
文章转载自山东Oracle用户组,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




