给出子网值时创建ipv6范围的有效方法

时间:2016-05-10 09:22:01

标签: sql oracle plsql

我需要处理像FE80:0000:0000:0000:0202:B3FF:FE1E:8329/120这样的ipv6范围,并使用 PL / SQL 块将地址存储在表中。

在我当前的实现中,我将地址转换为二进制,在while循环中迭代最小和最大地址,并将它们插入表中。

它适用于较小的范围,但需要一种有效的方法来处理大范围(使用fetch的大量插入行)

 while ipv6_counter_iterator <= ipv6_counter_max
          loop
        ipv6_value_intermediate := nvl(lpad(dec2bin(ipv6_counter_iterator),
                                            ipv6_counter,
                                            '0'),
                                       '');
        ipv6_binary_value       := substr(ipv6_addr, 1, ipv6_range) ||
                                   ipv6_value_intermediate;
        ipv6_address_value      := Binary_to_ipv6(ipv6_binary_value);
        ipv6_counter_iterator   := ipv6_counter_iterator + 1;
        insert into sdb_ip_range_values
          (ip_address, session_id)
        values
          (ipv6_address_value, session);
      end loop;
    END IF;

1 个答案:

答案 0 :(得分:0)

你应该考虑使用一个存储过程检查一个给定的ipv6地址是否在块中。

有两种方法:

  • 制作ipv6地址和范围二进制文件并为其构建子网掩码。然后比较ipv6地址和范围的二进制AND。它应该是一样的。
  • 如果地址大于或等于起始地址且小于或等于结束地址,则另一种方式是测试。