sql >> Database >  >> RDS >> Oracle

Hoe kun je een functie in een waar-clausule dwingen om eenmaal in orakel uit te voeren?

Waarom gebruik je hier überhaupt PL/SQL voor? Van wat je hebt gezegd dat je wat wiskunde aan het doen bent, waarom doe je dat niet gewoon in SQL? Dit zal ook mogelijk zijn met een combinatie van INSTR en SUBSTR, maar het is mooier om naar te kijken met 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-demonstratie van REGEXP_SUBSTR-uitvoer

Als je hebt om dit in PL/SQL te doen, moet je twee dingen doen:

  1. Kijk of je je functie kunt declareren als deterministisch .
  2. Probeer en profiteer van sub -query cachen .

Het lijkt alsof je er al 2 doet, maar je zou kunnen proberen dit uit te breiden door een WITH-clausule te gebruiken:

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. Python:voor- en nadelen van _mysql vs MySQLdb?

  2. postgres - selecteer * uit bestaande tabel - psql zegt dat tabel niet bestaat

  3. Bron niet gevonden Het JAR-bestand mysql-connector-java-5.1.20-bin.jar heeft geen bronbijlage

  4. Lege bestanden gegenereerd door het uitvoeren van `mysqldump` met behulp van PHP