From: Yoshio, To: me, Subject: q boixta
Recebi esse email do Gean, e acho que merece um post
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. 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. 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. 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”
Deixe um comentário |


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
Nossa, ROWID e ROWNUM fazem parte do padrão e LIMIT e OFFSET não? Onde esse mundo vai parar!
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.