"Da quello che ho visto, Oracle applica il predicato WHERE prima di determinare quali righe saltare."
Sì. È l'unico modo possibile. Non puoi saltare una riga da un set di risultati finché non hai determinato il set di risultati.
La risposta è semplicemente non limitare il numero di righe restituite dall'istruzione SELECT. Puoi comunque utilizzare i suggerimenti FIRST_ROWS_n per indicare all'ottimizzatore che non acquisirai l'intero set di dati.
Il software che chiama SELECT dovrebbe selezionare solo le prime n righe. In PL/SQL, sarebbe
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;