"D'après ce que j'ai vu, Oracle applique le prédicat WHERE avant de déterminer les lignes à ignorer."
Ouais. C'est la seule voie possible. Vous ne pouvez pas ignorer une ligne d'un jeu de résultats tant que vous n'avez pas déterminé le jeu de résultats.
La réponse est simplement de ne pas limiter le nombre de lignes renvoyées par l'instruction SELECT. Vous pouvez toujours utiliser les conseils FIRST_ROWS_n pour indiquer à l'optimiseur que vous ne saisirez pas l'ensemble de données complet.
Le logiciel appelant le SELECT ne doit sélectionner que les n premières lignes. En PL/SQL, ce serait
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;