आप इसके लिए पीएल/एसक्यूएल का उपयोग क्यों कर रहे हैं? आपने जो कहा है उससे आप कुछ गणित कर रहे हैं, एसक्यूएल में ऐसा क्यों न करें? यह INSTR और SUBSTR के संयोजन के साथ भी संभव होगा लेकिन REGEXP_SUBSTR के साथ देखना बेहतर है।
select to_number(regexp_substr(ip, '[^.]+', 1, 1)) * power(2,24)
+ to_number(regexp_substr(ip, '[^.]+', 1, 2)) * power(2,16)
+ to_number(regexp_substr(ip, '[^.]+', 1, 3)) * power(2,8)
+ to_number(regexp_substr(ip, '[^.]+', 1, 4))
, icb.*
, icl.*
from ip_city_block icb
join ip_city_location icl
on icl.locid = icb.locid
where to_number(regexp_substr(ip, '[^.]+', 1, 1)) * power(2,24)
+ to_number(regexp_substr(ip, '[^.]+', 1, 2)) * power(2,16)
+ to_number(regexp_substr(ip, '[^.]+', 1, 3)) * power(2,8)
+ to_number(regexp_substr(ip, '[^.]+', 1, 4))
between icb.startipnum and icb.endipnum
REGEXP_SUBSTR आउटपुट का SQL Fiddle प्रदर्शन
अगर आपके पास है PL/SQL में ऐसा करने के लिए आपको दो काम करने चाहिए:
- देखें कि क्या आप अपने फ़ंक्शन को के रूप में घोषित कर सकते हैं। नियतात्मक ।
- कोशिश करें और sub का लाभ उठाएं -क्वेरी कैशिंग ।
ऐसा प्रतीत होता है कि आप पहले से ही 2 कर रहे हैं, लेकिन आप WITH क्लॉज का उपयोग करके इसे आजमा सकते हैं और बढ़ा सकते हैं:
with the_ip as ( select get_ip_integer('74.253.103.98') as ip from dual )
select the_ip.ip
, icb.*
, icl.*
from ip_city_block icb
join ip_city_location icl
on icl.locid = icb.locid
join the_ip
on the_ip.ip between icb.startipnum and icb.endipnum