Oracle中IP地址和掩码转换成CIDR格式

企鹅博客
企鹅博客
企鹅博客
25193
文章
0
评论
2020年10月7日12:26:42 评论 9 views 1432字阅读4分46秒

遇到的问题如下:数据库中存储了IP地址,以及IP地址掩码,需要将他们转化成CIDR格式的,并且不仅仅是将掩码转化成CIDR对应的数字的问题,需要将原有的IP地址转化成对应的网络地址,例如IP地址是58.247.221.238,掩码是255.255.255.252,需要将其转化为58.247.221.236/30。

 

解决方案:我们知道,将IP地址和掩码通过位与函数就能得到对应的网络地址.Google一下,找到了将IPv4地址转成数字以及转化回来的函数。有了这两个函数,再利用Oracle 自带的bitand函数,问题就解决了。可以先将IP地址和掩码通过字符串转IP的函数转成数字,然后通过位与运算就能得到相应的网络地址对应的数字,再通过数字转字符串的功能,即得到对应的网络地址。至于/后面CIDR的数字,可以通过导入一张掩码和CIDR数字的对应表得到,不在详述.

 

  实际例子如下: 返回58.247.221.236

 

Sql代码 

select inttoip(BITAND(dottedQuadToNumber('58.247.221.238'), 

ottedQuadToNumber('255.255.255.252'))) from dual 

 

 

附: 将字符串转成数字的函数:

 

Sql代码 

CREATE OR REPLACE function dottedQuadToNumber ( dottedQuad IN VARCHAR2) return number is 

  Result NUMBER; 

begin 

  Result:= (substr(dottedQuad , 

            1, 

            (instr(dottedQuad , '.', 1, 1 ) - 1)) 

            * 256 * 256 * 256 

    ) + 

    (substr(dottedQuad , 

            instr(dottedQuad , '.', 1, 1 ) + 1, 

            instr(dottedQuad , '.', 1, 2 ) - 

            instr(dottedQuad , '.', 1, 1 ) - 1) * 256 * 256 

    ) + 

    (substr(dottedQuad , 

            instr(dottedQuad , '.', 1, 2 ) + 1, 

            instr(dottedQuad , '.', 1, 3 ) - 

            instr(dottedQuad , '.', 1, 2 ) - 1) * 256 

    ) + 

    (substr(dottedQuad , 

            instr(dottedQuad , '.', 1, 3 ) + 1) 

    ) ; 

  return(Result ); 

end dottedQuadToNumber ; 

 

数字转成ip地址的函数:

 

Sql代码 

CREATE OR REPLACE function inttoip(ip_address integer) return varchar2 

deterministic 

is 

begin 

    return to_char(mod(trunc(ip_address /256/ 256/256 ),256)) 

          || '.'|| to_char(mod(trunc(ip_address/ 256/256 ),256)) 

          || '.'|| to_char(mod(trunc(ip_address/ 256),256 )) 

          || '.'|| to_char(mod(ip_address, 256)); 

end; 

继续阅读
NUMA导致的Oracle性能问题 Linux-数据库

NUMA导致的Oracle性能问题

背景简介: Oracle版本:11.2.0.4   OS 版本:OEL5.8 在一次Oracle的Dataguard正常switchover过程中,遇到了一个极其诡异的问题,一条主业务的SQL语句在新...
Oracle表联结之嵌套循环 Linux-数据库

Oracle表联结之嵌套循环

1.单表访问: 分表,分区,建索引,全表扫描---开并行, 永远把它 放内存,压缩 2.多表关联,任何时刻只能是2个表关联,得到的结果集再和其他表关联。 3.嵌套循环:Oracle从较小结果集(驱动表...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: