"Từ những gì tôi đã thấy, Oracle áp dụng vị từ WHERE trước khi xác định những hàng nào cần bỏ qua."
Chuẩn rồi. Đó là cách duy nhất có thể. Bạn không thể bỏ qua một hàng trong tập kết quả cho đến khi xác định được tập kết quả.
Câu trả lời đơn giản là không giới hạn số hàng được trả về bởi câu lệnh SELECT. Bạn vẫn có thể sử dụng các gợi ý FIRST_ROWS_n để hướng dẫn trình tối ưu hóa rằng bạn sẽ không lấy toàn bộ tập dữ liệu.
Phần mềm gọi SELECT chỉ nên chọn n hàng đầu tiên. Trong PL / SQL, nó sẽ là
DECLARE
CURSOR c_1 IS
SELECT /*+FIRST_ROWS_1*/ qt.ID
FROM QueueTest qt
WHERE Locked IS NULL
ORDER BY PRIORITY
FOR UPDATE SKIP LOCKED;
BEGIN
OPEN c_1;
FETCH c_1 into ....
IF c_1%FOUND THEN
...
END IF;
CLOSE c_1;
END;