LIMIT e OFFSET non sono riconosciute da Oracle.

Per simulare una limit si può fare così:
SELECT * FROM table WHERE ROWNUM <= 10

Il che ritorna le prime 10 righe (poiché ROWNUM è 1-based)

Notiamo però che per simulare un OFFSET,LIMIT ci sono dei problemi: infatti
SELECT * FROM tabella WHERE ROWNUM BETWEEN 11 AND 20
non funziona

Possiamo però simulare una OFFSET,LIMIT scrivendo la query in questa forma
select * from (
select rownum as rn, tabella.* from tabella where rownum <= 20
) WHERE RN > 10

Va però detto che se usiamo una clausola ORDER BY, oracle effettua l'ordinamento DOPO aver limitato i valori, il che solitamente non è ciò che vogliamo. Quindi la seguente:
select * from (
select rownum as rn, tabella.* from tabella where rownum <= 20 order by campo
) WHERE RN > 10
non dà il risultato probabilmente atteso

Una soluzione a questo problema può essere ottenuta con il seguente workaround:
select * from (
select rownum as rn2, insel.* from (
select rownum as rn, tabella.* from tabella order by campo
) insel
) WHERE RN2 between 11 and 20

Quest'ultima query simula OFFSET, LIMIT in oracle e mantiene l'ordinamento voluto.
Il risultato è corretto, ma non so se ci sono metodi più efficienti per ottenere lo stesso.

Ciao
Demiurgo http://paolo.demiurgo.it