Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana Anda bisa memaksa fungsi di klausa where untuk dieksekusi sekali di Oracle?

Mengapa Anda menggunakan PL/SQL untuk ini sama sekali? Dari apa yang Anda katakan Anda sedang melakukan beberapa matematika, mengapa tidak melakukannya di SQL saja? Ini juga dapat dilakukan dengan kombinasi INSTR dan SUBSTR tetapi akan lebih indah untuk dilihat dengan 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

Demonstrasi SQL Fiddle dari keluaran REGEXP_SUBSTR

Jika Anda memiliki untuk melakukan ini di PL/SQL Anda harus melakukan dua hal:

  1. Lihat apakah Anda dapat mendeklarasikan fungsi Anda sebagai deterministik .
  2. Coba dan manfaatkan sub -permintaan cache .

Tampaknya Anda sudah melakukan 2, tetapi Anda dapat mencoba dan memperluas ini dengan menggunakan klausa 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. ORA-01792:jumlah maksimum kolom dalam tabel atau tampilan adalah 1000 kesalahan saat menggunakan WITH di sql

  2. Oracle:hanya mengekspor skema

  3. Bidang Boolean di Oracle

  4. Bergabung sendiri di oracle dengan contoh

  5. Apa yang diperlukan untuk bekerja dengan Oracle dari Visual Studio 2010?