Savepoint

Soluções em PostgreSQL

LIMIT e OFFSET no Oracle


Outra coisa pentelha no Oracle, fazer paginação de registros. Não, o Oracle não tem as cláusulas LIMIT e OFFSET. Elas são utilizadas no PostgreSQL e no MySQL. O padrão SQL 2008 estabelece o uso do OFFSET e FETCH, utilizado pelo DB2, MS SQL Server e também pelo PostgreSQL. Já o Oracle… bom o Oracle só permite usar o velho rownum, que infelizmente não obedece o ORDER BY, então você é obrigado a criar uma subconsulta para paginar dados.

Vamos ver 2 métodos aqui. O primeiro é o definido pelo mago do Oracle, o Tom Kyte, do Ask Tom:

SELECT * FROM (
  SELECT a.*, ROWNUM rnum FROM (
    SELECT * FROM tabela_enorme ORDER BY campo_indexado
  ) a WHERE ROWNUM <= 61200
) WHERE rnum >= 61000;
...
...
...
Decorrido: 00:00:31.39

Agora outro método utilizando algo que eu realmente adoro, Window Functions:

SELECT * FROM (
  SELECT row_number() OVER (ORDER BY campo_indexado) linha, p.* FROM tabela_enorme
) WHERE linha BETWEEN 91000 AND 91200;
...
...
...
Decorrido: 00:00:29.34

Ou seja, utilizando Window Functions você tem uma sintaxe mais elegante e compacta e ainda ganha no desempenho. Para variar, a solução mais simples é a melhor.

Claro… eu ainda espero que alguém na Oracle tenha o bom senso de implementar o LIMIT e OFFSET, assim como uma infinidade de outras coisas que tornam a vida do desenvolvedor mais simples.

Comments

4 respostas para “LIMIT e OFFSET no Oracle”

  1. Avatar de superpapitoAndré
    superpapitoAndré

    Honestamente, não acredito que a Oracle faça algo assim. Se for para complicar, então implementam. Para ajudar… Bem, melhor pensar duas vezes…

  2. Avatar de ROGÉRIO
    ROGÉRIO

    ainda bem que eles mudaram isso na versão 12, pq é um saco fazer desta forma…

  3. Avatar de Erikson
    Erikson

    Amigo, muito obrigado pelo post bastante objetivo e esclarecedor. Também gostei mais da segunda alternativa e estou adotando-a.

  4. Avatar de Augusto Ferreira

    Tirando a pegadinha nos operados = na primeira consulta funciona perfeitamente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress