将MAC地址增加1

时间:2015-10-07 09:59:47

标签: sql oracle

我需要将十六进制数(MAC地址)递增1。

例如,我有一个以这种格式的MAC地址:

00:A1:2C:3B:99:1F

我需要将此值增加1并以相同的格式保存新值:

00:A1:2C:3B:99:20

查询:

UPDATE Info
SET MAC = HEXTORAW(TO_CHAR(
                     TO_NUMBER(SUBSTR(RAWTOHEX(MAC), 1, 20), RPAD('x', 20, 'x')) + 1,
                     RPAD('fm0', 22, 'X')
                )
                || SUBSTR(RAWTOHEX(MAC), 21))
WHERE ID = '';

1 个答案:

答案 0 :(得分:0)

编辑:更新了更新语句以处理单位数的mac地址

这样可行,但以:FF结尾的情况不起作用。

            create table test_utsav_mac(id integer,mac varchar2(20));

            insert into test_utsav_mac
            values
            (1,'01:26:5b:61:54:c0');

        UPDATE TEST_UTSAV_MAC
        SET MAC=  CASE WHEN LENGTH(LTRIM(TO_CHAR(TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1,'xxxx'))) = 1
        THEN SUBSTR(MAC,1,15) || '0' || LTRIM(TO_CHAR( TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1, 'xxxx' ))
        ELSE SUBSTR(MAC,1,15) || LTRIM(TO_CHAR( TO_NUMBER( SUBSTR(MAC,16,2) , 'xx' )+1, 'xxxx' ))
        END
        WHERE ID = 1

            select * from test_utsav_mac;

输出

ID   MAC
1   01:26:5b:61:54:c1

substr(mac,1,15) || ltrim(to_char( to_number( substr(mac,16,2) , 'xx' )+1, 'xxxx' ))正在做的是

  • ltrim(to_char( to_number( substr(mac,16,2) , 'xx' )+1, 'xxxx' ))是 将最后一个十六进制值转换为十进制并以1递增。
  • 然后我将它转换回十六进制和修剪。
  • 然后连接其余部分 返回此结果的字符串。

PS:如果你想在其中处理:FF逻辑,那么把它放在PL / SQL块中,让它在这种情况下抛出异常。