Đố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 currval
và nextval
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?
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 coalesce
và case
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 coalsce
và case
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ì coalesce
và case
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
)