"Podle toho, co jsem viděl, Oracle použije predikát WHERE, než určí, které řádky se mají přeskočit."
Ano. Je to jediný možný způsob. Nemůžete přeskočit řádek ze sady výsledků, dokud sadu výsledků neurčíte.
Odpovědí je jednoduše neomezovat počet řádků vrácených příkazem SELECT. Stále můžete použít tipy FIRST_ROWS_n, které optimalizátoru nasměrují, že nebudete získávat celý soubor dat.
Software volající SELECT by měl vybrat pouze prvních n řádků. V PL/SQL by to bylo
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;