在oracle中生成IP地址

时间:2017-09-26 03:01:32

标签: oracle

我有一个数据库,其中一个字段具有IP地址的值。 ,默认值为12.123.60.165。从那些默认值我必须生成IP地址。最大值为256.256.256.256。

这是我的功能,仍未涵盖我需要的

/* Formatted on 9/26/2017 9:44:51 AM (QP5 v5.115.810.9015) */
SET SERVEROUTPUT ON

DECLARE
   IP    INTEGER;
   IP1   INTEGER;
   IP2   INTEGER;
   IP3   INTEGER;
   IP4   INTEGER;
   IPI   INTEGER := 1;
BEGIN

   IP1 := FLOOR (IPI / POWER (2, 24));
   IPI := IPI - (IP1 * POWER (2, 24));
   IP2 := FLOOR (IPI / POWER (2, 16));
   IPI := IPI - (IP2 * POWER (2, 16));
   IP3 := FLOOR (IPI / POWER (2, 8));
   IPI := IPI - (IP3 * POWER (2, 8));
   IP4 := IPI;

   DBMS_OUTPUT.PUT_LINE (IP1 || '.' || IP2 || '.' || IP3 || '.' || IP4);
END;
/

任何帮助都会非常感激

2 个答案:

答案 0 :(得分:2)

您可以使用dbms_random包生成随机值。 您需要此程序包的权限。 例如:

SQL>  select trunc(dbms_random.value(12,256) ) ip1,
  2        trunc(dbms_random.value(123,256) ) ip2,
  3        trunc(dbms_random.value(60,256) ) ip3,
  4        trunc(dbms_random.value(165,256) ) ip4
  5*  from dual

   IP1        IP2        IP3        IP4
---------- ---------- ---------- ----------
   156        163         78        231

或者在循环中生成。像这样:

declare
  ip1 int;
  ip2 int;
  cnt int := 0;
begin
  for i in 12..256 loop
    ip1 := i;
    for j in 123..256 loop
      ip2 := j; 
    end loop;
  end loop;
end;
/

答案 1 :(得分:1)

要生成一组所有IPv4,可以使用交叉连接和具有16条记录和交叉连接的CTE。但是我不确定你之后到底是什么。

with cte (A)  as (
SELECT 0 from dual UNION ALL
SELECT 1 from dual UNION ALL
SELECT 2 from dual UNION ALL
SELECT 3 from dual UNION ALL
SELECT 4 from dual UNION ALL
SELECT 5 from dual UNION ALL
SELECT 6 from dual UNION ALL
SELECT 7 from dual UNION ALL
SELECT 8 from dual UNION ALL
SELECT 9 from dual UNION ALL
SELECT 10 from dual UNION ALL
SELECT 11 from dual UNION ALL
SELECT 12 from dual UNION ALL
SELECT 13 from dual UNION ALL
SELECT 14 from dual UNION ALL
SELECT 15 from dual), 
--Get data set for 0 to 255 numbers. 
Get256Range as (SELECT  row_number() over (order by A.A)-1 seg
    FROM CTE A
    CROSS JOIN cte B)
--Now cross join the 256 4 times for each class of Ip.

SELECT A.Seg ||'.'|| B.Seg||'.'|| C.Seg||'.'||D.Seg as IPAddress
from Get256Range A
CROSS JOIN Get256Range B
CROSS JOIN Get256Range C
CROSS JOIN Get256Range D
--Not sure what part of the "set" you need but one could change these values 
--Limited for sizing; but one could create a table of all IPv4 addresses...
WHERE A.seg = 12
  and B.seg = 123;

如果需要,您可以包含前导零' ...

lpad(A.Seg,3,'0') ||'.'|| lpad(B.Seg,3,'0')||'.'|| lpad(C.Seg,3,'0')||'.'|| lpad(D.Seg,3,'0') IpAddressWithLeadZero

这样就可以根据特定范围进行排序或过滤

所以只返回大于012.123.060.165(不是效率最高)的那些

WHERE lpad(A.Seg,3,'0') ||'.'|| lpad(B.Seg,3,'0')||'.'|| lpad(C.Seg,3,'0')||'.'|| lpad(D.Seg,3,'0') >='012.123.060.165'

可能效率更高:

WHERE (A.Seg = 12 and B.Seg = 123 and C.Seg = 60 and D.Seg > 165) OR (A.Seg = 12 and B.Seg = 123 and C.Seg > 60) OR (A.Seg = 12 and B.Seg > 123) OR (A.Seg > 12)