Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào bạn có thể buộc một hàm trong mệnh đề where thực thi một lần trong oracle?

Tại sao bạn lại sử dụng PL / SQL cho việc này? Từ những gì bạn đã nói rằng bạn đang làm một số phép toán, tại sao không chỉ làm điều đó trong SQL? Điều này cũng có thể thực hiện được với sự kết hợp của INSTR và SUBSTR nhưng nhìn bằng REGEXP_SUBSTR sẽ đẹp hơn.

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

Trình diễn SQL Fiddle về đầu ra REGEXP_SUBSTR

Nếu bạn để làm điều này trong PL / SQL, bạn nên làm hai điều:

  1. Xem liệu bạn có thể khai báo hàm của mình là xác định .
  2. Hãy thử và tận dụng phụ -query caching .

Có vẻ như bạn đang làm 2, nhưng bạn có thể thử và mở rộng điều này bằng cách sử dụng mệnh đề 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. Khắc phục "Không thể mở ứng dụng" SQLDeveloper.app "."

  2. Cách tạo UUID phiên bản 4 (ngẫu nhiên) trên Oracle?

  3. Oracle SQL:Sử dụng trình tự trong chèn với Câu lệnh Chọn

  4. OracleConnection.Open đang ném ORA-12541 TNS không có người nghe

  5. Có cách nào để tạo lại một gói ODI bằng ODI Scenario không?