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

SQL Procédural MySQL Discussion :

Mon curseur ne me retourne qu'une valeur


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut Mon curseur ne me retourne qu'une valeur
    Bonjour à tous,
    J'essaie de faire une procédure qui devrait me retourner plusieurs lignes, je l'ai écrite comme je l'aurais fait avec sqlserver à 2 - 3 petits trucs près.

    Or, au moment de l'appel de la procédure, elle ne me retourne qu'un enregistrement, je merde quelque-part soit au niveau du soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    Voici la procédure stockée :
    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
    18
    19
    20
    21
    22
    23
     
    DELIMITER //
    CREATE DEFINER=`root`@`localhost` PROCEDURE `calculBudget`(p_idUtilisateur INT)
    BEGIN
     
    	DECLARE montant DECIMAL(9,2);
    	DECLARE done INT DEFAULT 0;
    	DECLARE i_idBudget INTEGER;
    	DECLARE i_montantBudget DECIMAL(9,2);			
    	DECLARE cur1 CURSOR FOR SELECT idBudget,montantBudget  FROM budget WHERE idUtilisateur = p_idUtilisateur;
    	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     
    	SET montant = 0;
     
    	 OPEN cur1;
    		REPEAT
    		FETCH cur1 INTO i_idBudget, i_montantBudget;
    			SET montant = montant + i_montantBudget;
    			SELECT i_idBudget, i_montantBudget, montant;		
     
    		UNTIL done END REPEAT;
    	  CLOSE cur1;
    END//
    La table est très simple, voir la pj.

    Merci par avance
    Images attachées Images attachées  

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Ca a l'air correct à part qu'il te manque un test sur done :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		REPEAT
    		FETCH cur1 INTO i_idBudget, i_montantBudget;
    IF done=0 THEN
    			SET montant = montant + i_montantBudget;
    			SELECT i_idBudget, i_montantBudget, montant;		
    END IF; 
    		UNTIL done END REPEAT;

    Es-tu certain que ça ne te retourne qu'un seul enregistrement et non pas X fois un enregistrement ?

    Si tu veux tous les enregistrements en une seule fois, je pense qu'il faut faire une table temporaire.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut
    Voici ce que ça me retourne alors que j'attends 6 lignes
    Images attachées Images attachées  

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Tu devrais essayer avec MySQL Workbench. A mon avis, ça te retourne six fois une ligne, mais ton client graphique ne sait pas le gérer.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut
    @Fred_34 bien vu ... phpmyadmin ne gère pas l'affichage, je vais devoir passer par une table temp ou mémoire ...

    Merci

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut
    Si ça peut servir, voici le curseur final, je suis passé par une table mémoire.
    Par contre je trouve dommage de devoir droper la table. Sous mssql il n'y a pas besoin.
    Du coup, je me demande, si la procédure stockée est en concurrence, comment mySQL le gère ?

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    DROP PROCEDURE `calculBudget`//
    CREATE DEFINER=`root`@`localhost` PROCEDURE `calculBudget`(p_idUtilisateur INT)
    BEGIN
     
    	DECLARE montant DECIMAL(9,2);
    	DECLARE done INT DEFAULT 0;
    	DECLARE i_idBudget INTEGER;
    	DECLARE i_montantBudget DECIMAL(9,2);			
    	DECLARE cur1 CURSOR FOR SELECT idBudget,montantBudget  FROM budget WHERE idUtilisateur = p_idUtilisateur;
    	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     
    	CREATE TABLE cool (
    		 idBudget INT
    		,montantBudget DECIMAL(9,2)
    		,montant DECIMAL(9,2)
    		)		
    	ENGINE = MEMORY;
     
    	SET montant = 0;
     
    	 OPEN cur1;
    		REPEAT
    		FETCH cur1 INTO i_idBudget, i_montantBudget;		
    		IF done=0 
    			THEN
    				SET montant = montant + i_montantBudget;
    				INSERT INTO cool (idBudget,montantBudget,montant)
    				SELECT i_idBudget, i_montantBudget, montant;		
    		END IF; 
    		UNTIL done END REPEAT;
    	  CLOSE cur1;
     
     
    	SELECT * FROM cool;
    	DROP TABLE cool;
     
    END

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Du coup je me demande si la sp est en concurrence comment mySQL le gere ?
    A mon avis ça risque de merdouiller...

    Il faut utiliser une table temporaire. Comme elle n'existe que pour la connexion en cours, il n'y a pas de problème de concurrence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DROP TEMPORARY TABLE IF EXISTS cool;#Important !!!
    CREATE TEMPORARY TABLE cool (
    		 idBudget INT
    		,montantBudget DECIMAL(9,2)
    		,montant DECIMAL(9,2)
    		) ENGINE = MEMORY;
    ...
    SELECT * FROM cool;
    DROP TEMPORARY TABLE cool;

    Sans procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT idBudget,
    	   montantBudget,
    	   @montant:= @montant+montantBudget AS montant 
    FROM budget
    INNER JOIN 
    (
      SELECT @montant:=0
    ) justForInit
    WHERE idUtilisateur = $p_idUtilisateur;

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 161
    Points : 72
    Points
    72
    Par défaut
    Oki merci je m'en vais tester ça.

    Mais du coup, même en précisant ENGINE = MEMORY, j'ai cru que j'étais sur une table mémoire comme sur mssql, qui est valide le temps de la procédure.

    Le fait de DROP TEMPORARY TABLE IF EXISTS cool;#Important ne risque pas de supprimer la même table qu'un autre utilisateur aurait créée lors de l'appel à la procédure.

    Merci des réponses.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/04/2010, 15h45
  2. [VB.Net]Procédure Stocké retournant une valeur
    Par waldo2188 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/05/2005, 12h56
  3. Réponses: 7
    Dernier message: 15/03/2005, 14h44
  4. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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