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

Đánh giá ngắn mạch CASE và COALESCE hoạt động với trình tự trong PL / SQL nhưng không hoạt động trong SQL

Đối với PL / SQL Oracle đảm bảo rằng nó sẽ sử dụng đánh giá ngắn mạch:

Từ: 2 Nguyên tắc cơ bản về ngôn ngữ PL / SQL

Khi bạn sử dụng nextval trong mã SQL, chúng ta có một tình huống khác.

Trước hết, chúng ta phải ghi nhớ rằng currvalnextval là các cột giả:

Từ: 3 Pseudocolumns .

Câu hỏi bây giờ là:tại sao Oracle đánh giá nextval ? hoặc Hành vi này có được nêu ở đâu đó không?

Từ: Sequence Pseudocolumns

Trường hợp của bạn rõ ràng là "1. Câu lệnh SELECT cấp cao nhất", nhưng điều đó không có nghĩa là logic ngắn mạch không đúng, mà chỉ có nextval đó luôn được đánh giá.

Nếu bạn quan tâm đến logic ngắn mạch, thì tốt hơn là loại bỏ nextval từ phương trình.

Một truy vấn như thế này không đánh giá truy vấn con:

select 6 c
  from dual
where  'a' = 'a' or 'a' = (select dummy from dual) 

Nhưng nếu cố gắng làm điều gì đó tương tự với coalesce hoặc case chúng ta sẽ thấy rằng Trình tối ưu hóa Oracle quyết định thực thi các truy vấn con:

select 6 c
  from dual
where  'a' = coalesce('a', (select dummy from dual) )

Tôi đã tạo các bài kiểm tra có chú thích trong bản trình diễn này trong SQLFiddle để hiển thị điều này.

Có vẻ như Oracle chỉ áp dụng logic ngắn mạch nếu với điều kiện OR, nhưng với coalescecase nó phải đánh giá tất cả các nhánh.

Tôi nghĩ rằng các thử nghiệm đầu tiên của bạn trong PL / SQL cho thấy rằng coalscecase sử dụng logic ngắn mạch trong PL / SQL, như Oracle đã nêu. Thử nghiệm thứ hai của bạn, bao gồm trình tự trong câu lệnh SQL, cho thấy rằng trong trường hợp đó, nextval vẫn được đánh giá, ngay cả khi kết quả không được sử dụng và Oracle cũng ghi lại điều đó.

Kết hợp hai thứ lại với nhau trông hơi kỳ cục, bởi vì coalescecase hành vi dường như cũng thực sự không nhất quán với tôi, nhưng chúng tôi cũng phải lưu ý rằng việc triển khai logic đó phụ thuộc vào việc triển khai ( đây là nguồn của tôi )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cột tự động tăng dần - Trình tự làm giá trị mặc định trong Oracle

  2. Trình kích hoạt chèn có cần câu lệnh cam kết không

  3. PL / SQL - Ví dụ về lỗi ứng dụng nâng cao

  4. CHỌN DISTINCT CLOB_COLUMN TỪ BẢNG;

  5. Oracle Chèn Lựa chọn với thứ tự của