针对ip地址排序的解决办法

近期开发中遇到对ip地址进行排序问题,普通的按字符串排序不能满足要求,网上查阅资料,大都是把ip地址分段截取,然后排序,方法比较复杂。咨询公司大牛,通过oracle中定义TYPE 和Type Body实现,基本思路就是把字符串类型转成整型,然后比较。

代码如下:

CREATE OR REPLACE TYPE "IP_TYPE"      as object
(
 /*------------------------------------------------------------------------------
  功能要求:处理IP格式(如:10.67.21.201)的字符串。
  参数定义:
  数据来源:
  调用方法:其它语言中调用,PL/SQL过程中
  特除说明:
  ----------------------------------------------------------------------------------*/
    IPstr varchar2(15),--IP地址
    IPnum int,--对应的数值
    constructor function IP_type(p_str varchar2) return self as result,
    constructor function IP_type(p_num int) return self as result,
    member function increase(p_num int) return IP_type,
    member function toString return varchar2,
    member function toNumber return int,
   order  member function order_fun(p_obj IP_type) return int
 )
create or replace type  body IP_type
  is
 /*------------------------------------------------------------------------------
  功能要求:IP_type对象的各函数实现。
  参数定义:
  数据来源:
  调用方法:其它语言中调用,PL/SQL过程中
  特除说明:
  ----------------------------------------------------------------------------------*/
   /*------------------------------------------------------------------------------
   功能要求:实现将IP地址转换成对应的数值
     ----------------------------------------------------------------------------------*/
   constructor function IP_type(p_str varchar2) return self as result
    is
       type t_tab is table of binary_integer index by binary_integer;
       l_tab  t_tab;
       function split(p_str varchar2, p_token char:=‘.‘) return t_tab as
         l_n    pls_integer := 0;
         l_idx  pls_integer := 0;
         l_args varchar2(1000) := p_str;
         tab  t_tab;
       begin
         if substr(l_args, -1, 1) <> p_token then
           l_args := l_args || p_token;
         end if;
         loop
           l_n := instr(l_args, p_token);
           exit when(nvl(l_n, 0) = 0);
           l_idx := l_idx + 1;
           tab(l_idx) := ltrim(rtrim(substr(l_args, 1, l_n - 1)));
           l_args := substr(l_args, l_n + 1);
         end loop;
         return tab;
       end;
   begin
     l_tab:=split(p_str);
     if l_tab.count=4 then
       self.IPstr:=p_str;
       for i in 1 .. l_tab.count
       loop
         self.IPnum:=nvl(self.IPnum,0)+l_tab(i)*power(256,4-i);
       end loop;
     end if;
     return;
   end;
   /*------------------------------------------------------------------------------
   功能要求:实现将数值转换成对应的IP地址
     ----------------------------------------------------------------------------------*/
   constructor function IP_type(p_num int) return self as result
   is
    l_first int:=floor(p_num/power(256,3));
   begin
     if l_first<255 then
     self.ipnum:=p_num;
     self.IPstr:=l_first||‘.‘||
                floor(mod(p_num,power(256,3))/power(256,2))||‘.‘||
                floor(mod(p_num,power(256,2))/power(256,1))||‘.‘||
                floor(mod(p_num,power(256,1)));
     else
     self.ipnum:=0;
     self.IPstr:=‘0.0.0.0‘;
     end if;
     return;
   end;
   /*------------------------------------------------------------------------------
     ----------------------------------------------------------------------------------*/
   member function increase(p_num int) return IP_type
   is
   begin
      return IP_type(self.ipnum+p_num);
   end;

   member function toString return varchar2
   is
   begin
    return IPstr;
   end;
   /*------------------------------------------------------------------------------
   功能要求:得到当前IP地址对应的数值
     ----------------------------------------------------------------------------------*/
  member function toNumber return int
   is
   begin
    return IPnum;
   end;
   /*------------------------------------------------------------------------------
     ----------------------------------------------------------------------------------*/
   order  member function order_fun(p_obj IP_type) return int
   is
   begin
      return sign(self.IPnum-p_obj.IPnum);
   end;
 end;

具体使用方式:
 select ip_type(‘10.67.2.101‘).ipnum,ip_type(‘10.67.2.101‘).ipstr from dual

返回结果:172163685,10.67.2.101

时间: 2024-10-15 14:27:04

针对ip地址排序的解决办法的相关文章

VMware虚拟机IP地址老是改变解决办法

1. 点击菜单栏中的编辑按钮 2. 选择虚拟网络编辑器 3. 选择正在使用的连接模式(一般是192.168.152.0的这个,选择后点击下方的DHCP设置) 4. 将租用时间设置长一点即可 原文地址:https://www.cnblogs.com/wangyusu/p/11405086.html

java 不允许同一账户不同IP 同时登录系统解决办法 兼容IE Firefox

需求就是 不允许同一个账户同一时间登录系统.只要有一个账户在线其他人就是不能用这个账户. 功能很简单,过程很纠结 . 这篇文章解决了兼容IE.Firefox 浏览器下,不同IP 地址 同一用户同时登陆的解决办法,包括应对浏览器没有正常关闭的情况. 说下解决过程,本来以为用session存取就好了,后来只能在同一个浏览器内标签窗口好用.跨浏览器就不行.因为sessionId不一样.(经测试 跟sessionID 没关系 ) 网上找了一些解决办法.又是些监听器 又是写 方法的: 又是数据库加字段判断

ueditor 1.4.3asp中图片地址不对的解决办法

找到文件夹ueditor\asp下的config.json文件,找到下面的代码,进行修改 "imageUrlPrefix": "/yychenxi/ueditor/asp/", /* 图片访问路径前缀 */ "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ 其中yychenxi是本人的网站名

Linux下检测IP地址冲突及解决方法

Linux下检测IP地址冲突及解决方法 问题说明: 在公司办公网内的一台物理机A上安装了linux系统(ip:192.168.9.120),在上面部署了jenkins,redmine,svn程序.由于是在办公网内,这台机器和同事电脑都是在同一网段的. 突然某天问题出来了:有部分同事远程ssh登陆不上这台linux系统的机器,jenkins/redmine/svn也登陆不上,其他部分同事可以正常使用. 后来发现,是因为这台linux机器的ip被人占用了,ip地址冲突引起的!! 下面介绍下检查ip地

win10 localhost 解析为 ipv6地址 ::1 的解决办法

localhost 访问时提示 not found 404,但是有127.0.0.1可以访问.最后找到原因,是因为 windows 把 localhost 解析为 ipv6 地址 ::1 而不是 127.0.0.1.查了hosts 把ipv6已经屏蔽了,127.0.0.1 localhost 也有,就是不能正常解析. 解决办法: 打开注册表,找到键 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters,添加类

IP地址冲突解决方案,局域网IP地址冲突如何解决?

IP地址冲突是网络管理的一个常见问题.尤其在企业局域网内部,由于管控策略的存在,总会有人试图通过修改IP地址来绕开管控.获取更多的上网权限以及更高的带宽.修改的IP一旦和公司的服务器发送IP冲突,会直接影响到办公和业务的正常运行.IP冲突的危害如下: 绕开行为管理策略和流控策略的管控. 导致被冲突的客户机断网. 和服务器IP冲突会影响业务的正常运行. 难以定位,使网络管理混乱无序. 本文将介绍几种常见的"IP地址冲突解决方案",以及出现IP冲突时如何解决的相关措施. 方案一. 禁止私自

阿里云esc云服务器IP不能访问的解决办法

问题:阿里云服务器,专有网络,web设置完毕,在服务器中localhost能够访问,并且关闭防火墙,但是使用公网ip无法访问. 解决:找到本实例安全组,配置规则,按照要求填入80或其他端口.配置完成后,能使用公网ip加端口访问

QT正则表达式---针对IP地址

判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(//d +)"); int pos = rx2.indexIn(ip); if(pos>-1)    { for(int i=0;i<4;i++)        {            if( rx2.cap(i*2+1).toInt()>=255 )            {  

全球免费公共 DNS 解析服务器 IP 地址列表推荐 (解决无法上网/加速/防劫持)

除了宽带提供商的 DNS 以外,像阿里云.腾讯云.Google.百度.IBM.CNNIC 等一些有足够实力的大型互联网公司也非常慷慨地为公众提供了免费的 DNS 解析服务器.异次元这就搜集了全球范围内这些可靠.免费高速的公共 DNS 服务器地址列表,供大家选择使用.(推荐使用 DNS Jumper 快速修改 DNS) 国内免费公共 DNS 域名解析服务收集 以下收集的都是目前全球范围内 (更多数是国内的) 比较靠谱的免费公共 DNS 服务的 IP 地址.由于地区差异,同一组 DNS 服务器在不同