Tại sao bạn lại sử dụng PL / SQL cho việc này? Từ những gì bạn đã nói rằng bạn đang làm một số phép toán, tại sao không chỉ làm điều đó trong SQL? Điều này cũng có thể thực hiện được với sự kết hợp của INSTR và SUBSTR nhưng nhìn bằng REGEXP_SUBSTR sẽ đẹp hơn.
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
Trình diễn SQL Fiddle về đầu ra REGEXP_SUBSTR
Nếu bạn có để làm điều này trong PL / SQL, bạn nên làm hai điều:
- Xem liệu bạn có thể khai báo hàm của mình là xác định .
- Hãy thử và tận dụng phụ -query caching .
Có vẻ như bạn đang làm 2, nhưng bạn có thể thử và mở rộng điều này bằng cách sử dụng mệnh đề 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