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

Oracle Discussion :

[curseur] Nombre d'enregistrement


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 111
    Points
    111
    Par défaut [curseur] Nombre d'enregistrement
    Bonjour,

    Je souhaiterai récupérer le nombre d'enregistrement(le nombre de ligne) ramené par l'execution de ma selection associée a mon curseur, j'utilise la propriété %ROWCOUNT mais malheuresement ca ne marche pas, ca me ramène toujours 0. J'ai juste besoin de savoir s'il y a au moins 1 enregistrement rapporté par l'appel du curseur c_loyer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    DECLARE 
      idCon contratLocation.idContrat%TYPE;
      CURSOR c_idCon Is
      select idContrat from contratLocation where finBail > CURRENT_DATE;
     
      CURSOR c_loyer(id loyer.idLoyer%type) Is
      select idLoyer,finExercice from loyer where finExercice > CURRENT_DATE and idContrat = id;
     
    BEGIN
      FOR Cur in c_idCon loop
        DBMS_OUTPUT.PUT_LINE('Un identifiant de contrat a traiter : ' || Cur.idContrat);
        open c_loyer(cur.idContrat);
        DBMS_OUTPUT.PUT_LINE('=>  Nombre de ligne ' || c_loyer%ROWCOUNT);
        close c_loyer;
      end loop;
    END;

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Je vais peut-être paraitre un peu bête... mais pourquoi tu ne fais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id,COUNT(idLoyer) 
    from contratLocation,loyer 
        where finBail > CURRENT_DATE
      and finExercice > CURRENT_DATE 
      and idContrat = id
    GROUP BY id
    Tu cherches bien le nombre de loyer/contrat ?

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FOR i IN ( select id,COUNT(idLoyer) nb
    from contratLocation,loyer 
        where finBail > CURRENT_DATE
      and finExercice > CURRENT_DATE 
      and idContrat = id
    GROUP BY id)) LOOP
    DBMS_OUTPUT.PUT_LINE('Un identifiant de contrat a traiter : ' ||
    i.id);
    DBMS_OUTPUT.PUT_LINE('=>  Nombre de ligne ' || i.nb);
     
    END LOOP;

  4. #4
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Une idée non vérifié. A mon avis, %ROWCOUNT doit ramener le nombre de ligne REELLEMENT traitée. Or comme tu fais un open sans aucun fetch, tu ne ramènes aucune ligne et donc ROWCOUNT = 0.

    Si on a bien compris ton problème, je suis d'accord avec Fred_D. C'est bien un COUNT qu'il te faut.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par pier*
    J'ai juste besoin de savoir s'il y a au moins 1 enregistrement rapporté par l'appel du curseur c_loyer.
    Je pense dans ce cas qu'il vaut mieux faire (plus performant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
       select 1
       into v
       from dual
       where exists (select 1 
                   from contratLocation,loyer 
                   where finBail > CURRENT_DATE
                   and finExercice > CURRENT_DATE 
                   and idContrat = id)
    exception
        when no_data_found then ...
    end;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 45
    Points : 52
    Points
    52
    Par défaut
    Salut tout le monde,

    la propriété %ROWCOUNT d'un curseur donne le nombre de lignes réellement fetchées c'est-à-dire qu'il s'incrémente à chaque fetch dans une boucle.

    Pour savoir s'il existe des enregistrements, je pratique de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*)
    FROM DUAL
    WHERE EXISTS (SELECT 1 FROM ....)
    Cette query ne renvoit pas d'exception no_data_found (count(*)), donc soit tu auras 0, soit 1 dans ton count.

    A+

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est parfait pour un test d'existence mais pas pour un comptage cette méthode

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 45
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Fred_D
    c'est parfait pour un test d'existence mais pas pour un comptage cette méthode
    Tout à fait, je lui ai proposée cette solution car son soucis est de savoir s'il existe ou non des records dans sa table.

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    d'après le code c'est plutôt le nombre de loyer par contrat qui l'intéresse

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par goplay
    Tout à fait, je lui ai proposée cette solution car son soucis est de savoir s'il existe ou non des records dans sa table.
    Exactement ce que je voulais mais j'ai trouvé une autre technique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     DECLARE
      nb NUMBER(10);
      CURSOR c_loyer(id loyer.idContrat%type) Is
      select COUNT(idLoyer) 
      from loyer 
      [where finExercice > CURRENT_DATE 
      and loyer.idContrat = id;
      [...]
      open c_loyer(Cur.idContrat);
      fetch c_loyer into nb;
      if(nb = 0) then  
      [...]

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    comme je l'ai montré c'est malheureusement pas le plus performant

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 31/01/2008, 08h50
  2. [DB] Nombre d'enregistrements d'une table
    Par Mister Nono dans le forum Bases de données
    Réponses: 26
    Dernier message: 09/05/2006, 09h51
  3. Limiter le nombre d'enregistrement
    Par BXDSPORT dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/04/2004, 16h26
  4. [débutant] Limitation du nombre d'enregistrement renvoyé
    Par tmcgrady dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/11/2003, 09h41
  5. XMLGram et nombre d'enregistrements par page
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 7
    Dernier message: 26/02/2003, 12h35

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