我有一个数据库,其中一个字段具有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;
/
任何帮助都会非常感激
答案 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)