Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Forza Oracle a restituire le prime N righe con SKIP LOCKED

"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;