Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 5 de maio de 2014

Selecionando registros entre intervalos de linhas no Oracle 12c com as cláusulas OFFSET e FETCH

Por Eduardo Legatti

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:

Postagens populares