Datalbi  
Créé le 12/10/2015 par Laurent Bourcier

Oracle 12c Nouvelles Fonctionnalités : Limitation des FETCH

Introduction

A l'instar de SQL Server et MySQL, Oracle offre maintenant la possibilité de limiter le nombre de lignes retournées par une requête et sans utiliser ROWNUM.

La clause OFFSET permet de déclarer à quelle ligne doit commencer le fetch.

La clause FETCH FIRST (ou FETCH NEXT qui est strictement identique) permet de déclarer le nombre de lignes à retourner.

Mise en oeuvre

Syntaxe :.
SELECT ... 
FROM table_name
[ ORDER BY ... ]
[ OFFSET n ROW|ROWS]
[ FECTH FIRST|NEXT   
     [ n ROW|ROWS    |    n PERCENT ROW|ROWS ] 
  ONLY|WITH TIES ]
;

Les mots clé ROW et ROWS sont strictement identiques.

Les mots clé FIRST et NEXT sont strictement identiques.

ONLY permet de retourner exactement le nombre de lignes demandées

WITH TIES permet de retourner plus de lignes si la dernière ligne contient des doublons

PERCENT permet de spécifier un pourcentage sur le nombre de lignes retournées.

Le nombre de lignes à fetcher est facultatif (par défaut 1 ligne).

Les clause ONLY ou WITH TIES sont obligatoires.

Exemples

--
-- Creation de la table
--
CREATE TABLE TEST_FETCH (
ID          NUMBER,
COMMENTS    VARCHAR2(30)
);

--
-- Insertion des données
-- ID de 1 à 10
--

INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (1, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (10, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (2, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (9, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (3, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (8, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (4, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (7, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (5, 'test');
INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (6, 'test');

-- insertion d'un doublon

INSERT INTO TEST_FETCH (ID, COMMENTS) VALUES (4, 'test');
COMMIT;



SELECT * FROM TEST_FETCH ORDER BY ID FETCH FIRST 4 ROWS ONLY;


        ID COMMENTS                     
---------- ------------------------------
         1 test                           
         2 test                           
         3 test                           
         4 test                           


SELECT * FROM TEST_FETCH ORDER BY ID FETCH FIRST 4 ROWS WITH TIES;


        ID COMMENTS                     
---------- ------------------------------
         1 test                           
         2 test                           
         3 test                           
         4 test                           
         4 test                           


SELECT * FROM TEST_FETCH ORDER BY ID OFFSET 2 ROWS FETCH FIRST 4 ROWS ONLY;


        ID COMMENTS                     
---------- ------------------------------
         3 test                           
         4 test                           
         4 test                           
         5 test                           


SELECT * FROM TEST_FETCH ORDER BY ID FETCH FIRST ROW ONLY;


        ID COMMENTS                     
---------- ------------------------------
         1 test   


SELECT * FROM TEST_FETCH ORDER BY ID FETCH FIRST 50 PERCENT ROWS ONLY;


        ID COMMENTS                     
---------- ------------------------------
         1 test                           
         2 test                           
         3 test                           
         4 test                           
         4 test                           
         4 test                           

 6 lignes sélectionnées