なぜこれにPL/SQLを使用しているのですか?あなたがいくつかの数学をしているとあなたが言ったことから、なぜそれをSQLでやらないのですか?これは、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出力のSQLFiddleデモンストレーション
持っている場合 PL / SQLでこれを行うには、次の2つのことを行う必要があります。
- 関数を
として宣言できるかどうかを確認します決定論的 。 - 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