Oracle
 sql >> база данни >  >> RDS >> Oracle

Как можете да принудите функция в клауза where да се изпълни веднъж в oracle?

Защо изобщо използвате 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

Демонстрация на SQL Fiddle на REGEXP_SUBSTR изход

Ако имате за да направите това в PL/SQL, трябва да направите две неща:

  1. Вижте дали можете да декларирате функцията си като детерминистичен .
  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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle база данни:разделяне на низ по знаци

  2. Въпроси за интервю за Oracle

  3. Посочен е невалиден URL адрес на Oracle:OracleDataSource.makeURL

  4. SQL и уникални комбинации от n колони

  5. групово вмъкване от Java в Oracle