"Från vad jag har sett tillämpar Oracle WHERE-predikatet innan det bestäms vilka rader som ska hoppa över."
Japp. Det är det enda möjliga sättet. Du kan inte hoppa över en rad från en resultatuppsättning förrän du har bestämt resultatuppsättningen.
Svaret är helt enkelt att inte begränsa antalet rader som returneras av SELECT-satsen. Du kan fortfarande använda FIRST_ROWS_n-tipsen för att styra optimeraren att du inte kommer att ta tag i hela datamängden.
Programvaran som anropar SELECT bör endast välja de första n raderna. I PL/SQL skulle det vara
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;