IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Nombre d'entrées d'un curseur


Sujet :

PL/SQL Oracle

  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    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...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    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.

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    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!

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nombre aleatoire entre un intervalle a et b
    Par aimad41 dans le forum C
    Réponses: 12
    Dernier message: 20/11/2006, 15h58
  2. [RegExp]Nombre compris entre 2 valeurs
    Par MystEre dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/11/2006, 12h02
  3. nombre jour entre deux dates
    Par lazzeroni dans le forum Oracle
    Réponses: 1
    Dernier message: 16/06/2006, 16h15
  4. Compter un nombre d'entré
    Par Nadd dans le forum Langage
    Réponses: 8
    Dernier message: 11/04/2006, 19h07
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo