2010-07-23 4 views
0

Existe-t-il un moyen pour une procédure stockée Oracle de renvoyer le jeu de résultats paginé (en tant que refcursor)? Par exemple, je voudrais passer à la procédure stockée le nombre d'enregistrements à renvoyer et le numéro de page intéressé. Ensuite, je veux seulement voir ce nombre d'enregistrements à mon client. Comment cela se fait-il du côté d'Oracle?Procédure stockée Oracle pour renvoyer le jeu de résultats paginé

à savoir

var v_numrecords number := 30; 
var v_pagenum number: = 5; 
var v_rows refcursor; 
exec my_stored_proc(:v_rows, :v_numrecords, :v_pagenum); 
print v_rows; -- expecting only 30 records of page number 5 back 

merci beaucoup.

Répondre

2

Vous pouvez utiliser Vous devez appliquer cette après les résultats ont été triés.

Voici un exemple: nous voulons des lignes 6 à 10.

SELECT * 
    FROM (SELECT e.*, ROWNUM rnum 
      FROM (SELECT * 
       FROM employee 
       ORDER BY employee_id) e 
      WHERE ROWNUM <= 10) 
    WHERE rnum >= 6; 

Pour obtenir des enregistrements 121 à 150, vous devez remplacer 10 dans le SELECT interne avec 150, puis remplacer le 6 dans la clause WHERE avec 121.

Dans votre procédure stockée, vous souhaiterez remplacer ces valeurs codées en dur par des variables.

2

Si vous souhaitez qu'Oracle retourne les lignes N à M d'un jeu de résultats, vous avez le choix entre plusieurs options, selon ce que vous voulez vraiment.

Si vous voulez que le jeu de résultats complet à être statique - les lignes à la page 5, par exemple, ne sera jamais apparaître éventuellement sur une autre page, vous devez soit:

  1. Ouvrir un curseur pour l'ensemble des résultats, et effectuer la pagination dans l'application. Faites en sorte que la procédure stockée conserve la totalité de l'ensemble de résultats dans une table temporaire globale et la paginera à partir de celle-ci. Cela rend votre procédure stockée plus compliquée, car il faudra construire le jeu de résultats à partir de zéro lorsque l'application le lui demande.

Si vous le faites, pas de soins que les lignes à la page 6 pourraient avoir été à la page 5 (le jeu de résultats est dynamique) que le curseur effectuer la coutume Oracle pagination:

select [columns] 
    from (select [columns], rownum as rn 
      from [some such tables] 
     where [some such conditions] 
      and rownum < (:v_pagenum + 1) * :v_numrecs 
     order by [some expression]) 
where rn >= :v_pagenum * :v_numrecs; 
Questions connexes