Olá,
No artigo de Abril/2008 eu demonstrei através de um exemplo prático, como selecionar registros de uma tabela dentro de um intervalo específico, fazendo uso da pseudo-coluna ROWNUM. Neste artigo irei demonstrar o mesmo cenário, só que agora, utilizando uma técnica disponível no Oracle 12c que introduziu uma nova cláusula no comando SELECT chamada de row_limiting_clause. Segue abaixo algumas das opções disponíveis nesta nova cláusula:
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]
Assim como foi feito no artigo de Abril/2008, irei criar uma tabela de teste e demonstrar como selecionar registros dentro de um intervalo específico fazendo uso das opções OFFSET e FETCH disponíveis à partir do Oracle 12c.
C:\>sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Seg Mai 5 10:54:47 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create table teste as select level id,
2 substr(dbms_random.string('U',10),1,10) valor
3 from dual connect by level <= 10;
Tabela criada.
SQL> select * from teste order by valor;
ID VALOR
---------- ----------
2 ARNKSCLTGX
8 BIQWGDVRUD
1 BPNHTRDKWL
10 JNHCSENXWG
7 MYVTHQHOSY
3 PECVQGHWAU
4 VLXVQQBIGY
9 WHRKAADTQT
5 XWQINROZMP
6 ZVKFERWVDT
10 linhas selecionadas.
Bom, com os registros demonstrados acima, o que deverá ser feito para que possamos obter a quarta (4ª) e a quinta (5ª) linha da tabela (ID 10 e 7)?
SQL> SELECT id,valor,rownum
2 FROM (SELECT id,valor
3 FROM (SELECT id,valor
4 FROM teste
5 ORDER by valor));
ID VALOR ROWNUM
---------- ---------- ----------
2 ARNKSCLTGX 1
8 BIQWGDVRUD 2
1 BPNHTRDKWL 3
10 JNHCSENXWG 4
7 MYVTHQHOSY 5
3 PECVQGHWAU 6
4 VLXVQQBIGY 7
9 WHRKAADTQT 8
5 XWQINROZMP 9
6 ZVKFERWVDT 10
10 linhas selecionadas.
De acordo com o resultado acima, sabemos que as linhas de ID 10 e 7 são as linhas que queremos obter. A seguir, irei aplicar a técnica demonstrada no artigo de Abril/2008 através da pseudo-coluna ROWNUM e, mais a frente, demonstrar a nova cláusula row_limiting_clause disponível no Oracle 12c.
-- Utilizando a técnica com o ROWNUM
SQL> SELECT id,valor
2 FROM (SELECT id,valor, rownum rn
3 FROM (SELECT *
4 FROM (select id,valor from teste)
5 ORDER BY valor)
6 WHERE rownum <= 5)
7 WHERE rn >= 4;
ID VALOR
---------- ----------
10 JNHCSENXWG
7 MYVTHQHOSY
-- Utilizando a cláusula row_limiting_clause do Oracle 12c
SQL> SELECT id,valor
2 FROM teste
3 ORDER BY valor
4 OFFSET 3 ROWS FETCH NEXT 2 ROWS ONLY;
ID VALOR
---------- ----------
10 JNHCSENXWG
7 MYVTHQHOSY
No mais, podemos perceber que com o Oracle 12c esta tarefa ficou muito mais simples e intuitiva. Na instrução SQL acima, o valor 3 significa o número da linha que deverá ser o ponto de partida do intervalo, e o valor 2 a quantidade de linhas que deverão ser retornadas à partir do ponto de partida. Vale a pena observar que a linha de ponto de partida (OFFSET) não é incluída no resultado.
Nenhum comentário:
Postar um comentário