From: Yoshio, To: me, Subject: q boixta

Postado por Rafael Sierra em 8/02/2008

Recebi esse email do Gean, e acho que merece um post :P


from: Yoshio Iwamoto <xxxx@gmail.com>
to: Rafael Jorge <yyyy@gmail.com>,
date: Feb 8, 2008 2:59 AM
subject: q boixta
mailed-by: gmail.com

2:59 AM (8 hours ago)


O Oracle não LIMIT nem OFFSET como o PostgreSQL e o MySQL.

Pra fazer paginação é um parto, tem que usar o ROWNUM, só que olha como essa bosta funciona:

ROWNUM is a pseudocolumn (not a real column) that is available in a
query. ROWNUM will be assigned the numbers 1, 2, 3, 4, ... N, where N
is the number of rows in the set ROWNUM is used with. A ROWNUM value
is not assigned permanently to a row (this is a common misconception).
A row in a table does not have a number; you cannot ask for row 5 from
a table—there is no such thing.

Até ai blz, teoricamente ele deveria funcionar como se fosse um campo virtual da tabela, onde o primeiro registro tem valor 1, e vai incrementando a cada registro:

ROWNUM / campos
1 valor1
2 valor2
3 valor3
...

Daí o obvio eu pensei, era fazer o "LIMIT e OFFSET" no Oracle assim:
[sql]
SELECT campos FROM tabela WHERE ROWNUMBER BETWEEN 11 AND 20 ORDER BY
campo_com_data;
[/sql]

Isso são os resultadados da página 2 se forem 10 resultados por página, certo? Porém:

  1. 1. O ROWNUMBER é calculado antes do ORDER BY, a solução para isso é criando um subselect:
    [sql]
    SELECT *
    FROM (SELECT campos
    FROM tabela
    ORDER BY campo_com_data)
    WHERE ROWNUMBER BETWEEN 11 AND 20;
    [/sql]
  2. 2. O ROWNUMBER não fuciona dessa forma na clausula WHERE, logo tenho que usar ele como um campo, fora do SELECT que contém o ORDER BY:
    [sql]
    SELECT *
    FROM ( SELECT novatabela.*, ROWNUM rnumber
    FROM ( SELECT campos
    FROM tabela
    ORDER BY campo_com_data) novatabela
    )
    WHERE rnumber BETWEEN 11 AND 20;
    [/sql]

  3. 3. Vou me matar

É por essas e outras que tem mais resultados no google sobre como migrar do Oracle para PostgreSQL do que o inverso. E quem migra do PG para o Oracle nunca mais usa Oracle.

3 Comentário para “From: Yoshio, To: me, Subject: q boixta”

  1. Fábio Telles disse em 8/02/2008 as 16:49

    O pior não é isso… é saber que o ROWID e o ROWNUM fazem parte do padrão SQL enquanto o LIMIT e o OFFSET não. Pergunta se a turma do PostgreSQL já foi convidada alguma vez para participar do grupo que cria o padrão SQL?

    []s

  2. Walter Cruz disse em 8/02/2008 as 10:17

    Nossa, ROWID e ROWNUM fazem parte do padrão e LIMIT e OFFSET não? Onde esse mundo vai parar!

  3. Zé Rola disse em 8/02/2008 as 18:19

    O pior de td essa merda é que se vc precisar dar manutenção, depois de toda mágica que fez para trazer os Xs registros em ordem, não dá, pq ele não reconhece o ROWID.

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.