129 votes

Paging avec Oracle

Je ne suis pas aussi familier avec Oracle comme je voudrais être. J'ai quelques 250k enregistrements, et je veux les afficher 100 par page. Actuellement, j'ai une procédure stockée qui récupère tous les quart d'un million d'enregistrements à une base de données à l'aide d'un adaptateur de données, et l'ensemble de données, et le dataadapter.De remplissage(dataset) méthode sur les résultats de la procédure stockée. Si j'ai "Numéro de Page" et "Nombre d'enregistrements par page" que des valeurs entières, je peux passer comme paramètres, quel serait le meilleur moyen pour revenir simplement cette section particulière. Dire, si je passe 10 comme un numéro de page, et de 120 nombre de pages, par l'instruction select, il me donnerait la 1880th par le biais de 1200e, ou quelque chose comme ça, mes calculs dans ma tête pourrait être éteint.

Je suis en train de faire cela .NET avec C#, de la pensée qui n'est pas important, si je peux l'obtenir à droite sur le sql côté, alors que je devrais être cool.

Mise à jour: j'ai été en mesure d'utiliser de Brian suggestion, et c'est génial de travailler. J'aimerais travailler sur certains d'optimisation, mais les pages sont à venir dans les 4 à 5 secondes plutôt que d'une minute, et ma pagination de contrôle a été en mesure d'intégrer très bien avec mes nouvelles stockées procs.

172voto

Brian Schmitt Points 4246

Quelque chose comme ça devrait marcher: Sur le blog de Frans Bouma

 SELECT * FROM
(
    SELECT a.*, rownum r__
    FROM
    (
    	SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
    	ORDER BY OrderDate DESC, ShippingDate DESC
    ) a
    WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
 

155voto

Chobicus Points 1104

Demandez à Tom sur la pagination et les fonctions analytiques très utiles.

Ceci est extrait de cette page:

 select * from (
    select /*+ first_rows(25) */
     object_id,object_name,
     row_number() over
    (order by object_id) rn
        from all_objects)
    where rn between :n and :m
        order by rn;
 

9voto

Furetto Points 1

Essayez ce qui suit:

 SELECT *
FROM
  (SELECT FIELDA,
    FIELDB,
    FIELDC,
    ROW_NUMBER() OVER (ORDER BY FIELDC) R
  FROM TABLE_NAME
  WHERE FIELDA = 10
  )
WHERE R >= 10
AND R   <= 15;
 

via [tecnicume]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X