Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zmusić funkcję w klauzuli where do jednorazowego wykonania w Oracle?

Dlaczego w ogóle używasz do tego PL/SQL? Z tego, co powiedziałeś, robisz trochę matematyki, dlaczego nie zrobić tego po prostu w SQL? Będzie to również możliwe z kombinacją INSTR i SUBSTR, ale ładniej jest patrzeć na 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

Demonstracja danych wyjściowych REGEXP_SUBSTR SQL Fiddle

Jeśli masz aby to zrobić w PL/SQL należy zrobić dwie rzeczy:

  1. Sprawdź, czy możesz zadeklarować swoją funkcję jako deterministyczny .
  2. Wypróbuj i skorzystaj z sub - buforowanie zapytań .

Wygląda na to, że robisz już 2, ale możesz spróbować rozszerzyć to za pomocą klauzuli 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. SQL:Przeszukaj listę kolumn o podanej wartości (w wierszu)

  2. Dobra referencja dla Oracle PL/SQL

  3. Znajdź wartości, które nie istnieją w tabeli

  4. Zaktualizuj tabelę z innej tabeli w Oracle

  5. Parametry połączenia Oracle 11g ado dla ODBC (nie OLEDB) przy użyciu 64-bitowego programu Excel VBA (DSN Less i tnsnames)