„Z tego, co widziałem, Oracle stosuje predykat WHERE przed określeniem wierszy do pominięcia”.
Tak. To jedyny możliwy sposób. Nie możesz pominąć wiersza z zestawu wyników, dopóki nie określisz zestawu wyników.
Odpowiedzią jest po prostu nie ograniczanie liczby wierszy zwracanych przez instrukcję SELECT. Nadal możesz użyć wskazówek FIRST_ROWS_n, aby wskazać optymalizatorowi, że nie będzie pobierał pełnego zestawu danych.
Oprogramowanie wywołujące SELECT powinno wybrać tylko pierwsze n wierszy. W PL/SQL byłoby to
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;