Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 15h26   #1
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 956
Points : 17 956
Par défaut Nombre d'entrées d'un curseur

Bonjour,

J'ai une requete qui est de la forme suivante (dans du code C, mais ce n'est pas ca qui me pose probleme) :

Code C :
1
2
3
4
5
6
7
8
9
10
11
12
13
EXEC SQL PREPARE mon_curseur FROM ma_requete;
 
EXEC SQL DECLARE liste_result CURSOR FOR mon_curseur;
EXEC SQL OPEN liste_result;
 
while (condition)
{
  EXEC SQL FETCH liste_result INTO .... ;
 
  /* traitement */
}
 
EXEC SQL CLOSE liste_result;

Ma question est la suivante : je cherche a connaitre le nombre de resultats de la requete, sans pour autant faire un "count (*)", ni en comptant le nombre de passages dans le while. Ca peut etre au niveau de l'open, du fetch, ... ca n'a pas d'importance pour moi.

En gros, je voudrais etre capable de limiter le nombre de resultats de la requete, mais aussi savoir s'il y en avait plus en base ou non.

Si je ne suis pas clair, n'hesitez pas demander des explications, je sais que je n'ai pas tres bien explique.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h42   #2
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 868
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 868
Points : 11 725
Points : 11 725
Pour connaître dès la première ligne retournée par ton curseur le nombre de lignes total, il y a un moyen simple... le retourner dans toutes les lignes.
Code :
1
2
3
SELECT  COUNT(*) OVER() nb_ligne_total
    ,   mes_colonnes
FROM    ma_requete
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 16h01   #3
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 956
Points : 17 956
Bonjour,

Merci pour cette reponse, qui permet effectivement de faire ce que je veux.

Neanmoins, j'avoue que je pensais qu'il y avait mecanisme moins... plus... enfin... Disons un truc plus "pro" qui fasse moins "bidouille" :-)
C'est pas que la solution ne fonctionne pas hein, mais bon...
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 09/01/2013, 16h39   #4
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 104
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 104
Points : 8 000
Points : 8 000
Citation:
Envoyé par gangsoleil Voir le message
... Disons un truc plus "pro" qui fasse moins "bidouille" :-)
C'est pas que la solution ne fonctionne pas hein, mais bon...
Difficile de comprendre ce que vous voulez en fait : soit une simple requête de pagination soit compter le nombre des enregistrements.

Mais oui, sans compter il n’est pas possible de savoir combien il y en a ! Et traiter les fonctions analytiques de "bidouillage" c’est juste montrer ne pas savoir de quoi on parle.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h49   #5
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 956
Points : 17 956
Citation:
Envoyé par mnitu Voir le message
Difficile de comprendre ce que vous voulez en fait : soit une simple requête de pagination soit compter le nombre des enregistrements.
Je construis un curseur, que je vais parcourir, et je veux savoir combien d'entrees je vais devoir parcourir, avant de les parcourir, sans faire une seconde requete. Il ne me parait pas aberrant, lorsqu'on concoit un tel mecanisme, de prevoir quelque chose pour avoir le nombre de reponse.

Citation:
Envoyé par mnitu Voir le message
Mais oui, sans compter il n’est pas possible de savoir combien il y en a !
Et le moteur de base de donnees il ne les a pas comptees, ou au moins ajoutees une a une dans le curseur ? Il "sait" donc combien il y en a.

Citation:
Envoyé par mnitu Voir le message
Et traiter les fonctions analytiques de "bidouillage" c’est juste montrer ne pas savoir de quoi on parle.
Ajouter le nombre d'entrees total a chaque ligne est bien un bidouillage a mon sens, independamment de la fonction qui permet d'obtenir ce nombre -qui elle n'est pas du bidouillage, je suis bien d'accord.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h53   #6
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 570
Points : 13 570
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par gangsoleil Voir le message
Et le moteur de base de donnees il ne les a pas comptees, ou au moins ajoutees une a une dans le curseur ? Il "sait" donc combien il y en a.
Non justement, il va lire les lignes au fur et à mesure qu'il parcours le curseur.
Tant qu'il n'est pas à la fin, il ne sait pas combien de lignes il va lire.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 17h06   #7
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 956
Points : 17 956
Citation:
Envoyé par Waldar Voir le message
Non justement, il va lire les lignes au fur et à mesure qu'il parcours le curseur.
Tant qu'il n'est pas à la fin, il ne sait pas combien de lignes il va lire.
Mea culpa : je ne connais pas le mecanisme des curseurs, et je ne pensais pas que c'etait parcouru au fur et a mesure.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 17h11   #8
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 104
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 104
Points : 8 000
Points : 8 000
Soit vous le faite par une requête de pagination donc vous savez combien des enregistrements peuvent exister au maximum dans le résultat (ce qui n’est pas toujours égale au nombre des enregistrements réellement ramènes parce que rien ne garanti que la dernière page contient ce nombre) soit vous faite une requête normale pour lequel Oracle ne compte jamais le nombre des enregistrements d’avance !

Il est vrai qu’il les compte mais, seulement au fur et au mesure de vos instructions fetch ! Donc après chaque fetch vous pouvez récupérer le nombre cumulativ des enregistrements ramenés jusqu’à ce moment. Mais vous ne pouvez pas savoir, sans faire un autre fetch combien il y en reste ! Ca marche comme ça !

Pour connaître le nombre des enregistrements qui peuvent être ramenés par une requête il faut les compter. Soit vous faite ce comptage dans une requête à part et en principe, ça pose un problème de cohérence entre le résultat obtenu par la fonction du comptage et le résultat réel, soit vous le faite via la fonction analytique comme montre dans l’exemple.

Par rapport à votre demande initiale : peut être que vous voulez ramener au maximum disons 100 lignes et annoncer avec un message que des autres lignes existent mais qui n’ont été pas prises en compte. Si votre besoin est celui ci alors vous pouvez l’accomplir en récupérant le nombre des enregistrements actuellement ramènes et si vous atteigniez le seuil faire un fetch de plus pour savoir si il y en a encore. Mais sans savoir combien!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 07h37   #9
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 956
Points : 17 956
Merci pour toutes ces explications.

Ce que je dois faire correspond bien a ce qui a ete decrit : ramener un certain nombre d'enregistrements, tout en sachant combien il y en avait qui correspondent a la requete.

La premiere solution correspond bien a ce que je fais, donc hop, vendu !

Merci a tous ceux qui ont pris le temps de m'expliquer.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h22.


 
 
 
 
Partenaires

Hébergement Web