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 :

Boucle WHILE qui ne boucle pas [MariaDB]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut Boucle WHILE qui ne boucle pas
    Bonjour à tous.
    La boucle while en ligne 14 fonctionne pour var_i = 1 : La LOOP de la ligne 16 insère 60 enregistrements avec var_i = 1, puis la procédure s’arrête au lieu d'incrémenter var_i de 1 en ligne 25.
    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
    DELIMITER $$
    drop procedure if exists sujets_importants $$
    CREATE PROCEDURE sujets_importants()
    BEGIN
    	declare var_i INT default 1;
    	DECLARE done INT DEFAULT FALSE;
    	DEclare v_id INT;
    	DECLARE v_sujet CHAR(250); 
    		declare cur1 CURSOR FOR
    		SELECT id , Avenir__Cinq_sujets_les_plus_prioritaires FROM `20231009_sainte_gemmes_en_2035`
    		WHERE Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',(SELECT sp.intitule  from sujets_prioritaires sp WHERE sp.id=var_i),'%');
    		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
    	read_while: WHILE (var_i < 11) DO
    		OPEN cur1;
    		read_loop: LOOP
    			FETCH cur1 INTO v_id,v_sujet;
    			IF done THEN
    				LEAVE read_loop;
    			ELSE
    				INSERT INTO lien__personne__sujet_prioritaire VALUES(v_id,var_i);
    			END IF;
    		END LOOP read_loop;
    		close cur1;
    		SET var_i := var_i+1;
    	END WHILE read_while;
    END$$
    DELIMITER ;
    call sujets_importants();
    Je dois louper un truc
    Merci pour vos lumières

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Ne serait-ce tout simplement pas que le "var_i" dans le CURSOR n'est évalué qu'une seule fois à la déclaration du CURSOR ?
    Ce dont vous avez besoin est d'un CURSOR paramétré.

  3. #3
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    "CURSOR paramétré" ?
    J'ai trouvé un lien en PL/SQL mais pas avec MySQL ... Je me trompe ? => oui finalement ça existe depuis MariaDB 10 !

  4. #4
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    Du coup, j'ai ajouté un paramêtre au curseur mais ça ne change rien ... Il n'y a toujours que les 60 premiers INSERT avec l'indice 1 qui sont enregistrés
    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
    DELIMITER $$
    drop procedure if exists sujets_importants $$
    CREATE PROCEDURE sujets_importants()
    BEGIN
    	declare var_sujet_id INT default 1;
    	DECLARE done INT DEFAULT FALSE;
    	DEclare v_id INT;
    	DECLARE v_sujet CHAR(250); 
    		declare cur1  CURSOR  (var_i INT) FOR
    		SELECT id , Avenir__Cinq_sujets_les_plus_prioritaires FROM `20231009_sainte_gemmes_en_2035`
    		WHERE Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',(SELECT sp.intitule  from sujets_prioritaires sp WHERE sp.id=var_i),'%');
    		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
    	read_while: WHILE (var_sujet_id < 11) DO
    		OPEN cur1(var_sujet_id);
    		read_loop: LOOP
    			FETCH cur1 INTO v_id,v_sujet;
    			IF done THEN
    				LEAVE read_loop;
    			ELSE
    				INSERT INTO lien__personne__sujet_prioritaire VALUES(v_id,var_sujet_id);
    			END IF;
    		END LOOP read_loop;
    		close cur1;
    		SET var_sujet_id := var_sujet_id+1;
    	END WHILE read_while;
    END$$
    DELIMITER ;
    call sujets_importants();

  5. #5
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    J'ai simplifié le code avec une boucle for en ligne 12:
    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
    DELIMITER $$
    drop procedure if exists sujets_importants $$
    CREATE PROCEDURE sujets_importants()
    BEGIN
    	DECLARE done INT DEFAULT FALSE;
    	DEclare v_id INT;
    	declare cur1  CURSOR  (var_i INT) FOR
    		SELECT id  FROM `20231009_sainte_gemmes_en_2035`
    		WHERE Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',(SELECT sp.intitule  from sujets_prioritaires sp WHERE sp.id=var_i),'%');
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
    	FOR v_sujet_id IN 1..10 DO
    		OPEN cur1(v_sujet_id);
    		read_loop: LOOP
    			FETCH cur1 INTO v_id;
    			IF done THEN
    				LEAVE read_loop;
    			END IF;
    			INSERT INTO lien__personne__sujet_prioritaire VALUES(v_id,v_sujet_id);
    		END LOOP read_loop;
    		close cur1;
    	END FOR;
     
    END $$
    DELIMITER ;
    call sujets_importants();
    Mais, manifestement, cette boucle n'est effectuée qu'une fois, avec 60 insertions pour la valeur 1 de v_sujet_id. Pourtant, la requête du curseur, exécutée seule, retourne bien des valeurs pour v_sujet_id variant de 1 à 10,

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Si ce SELECT, à adapter si besoin, renvoie bien les données souhaitées à insérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.id as v_id, t2.id as v_sujet_id  
      FROM 20231009_sainte_gemmes_en_2035 t1
      join (SELECT sp.id, sp.intitule 
              from sujets_prioritaires sp 
    		 WHERE sp.id between 1 and 10
    		) t2
        on t1.Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',t2.intitule,'%');
    Alors il suffit de faire un INSERT INTO SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO lien__personne__sujet_prioritaire (la_col_v_id, la_col_v_sujet_id)
    SELECT t1.id as v_id, t2.id as v_sujet_id  
      FROM 20231009_sainte_gemmes_en_2035 t1
      join (SELECT sp.id, sp.intitule 
              from sujets_prioritaires sp 
    		 WHERE sp.id between 1 and 10
    		) t2
        on t1.Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',t2.intitule,'%');

  7. #7
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    Vous avez tout à fait raison skuatamad, ça fonctionne parfaitement avec votre élégante solution

    Pour ceux que ça intéresse, j'ai résolu ma question employant un curseur en sortant la boucle for de la 1° procédure :
    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
    DELIMITER $$
    drop procedure if exists sujets_importants $$
    CREATE PROCEDURE sujets_importants(v_sp_id INT)
    BEGIN
    	DECLARE done INT DEFAULT FALSE;
    	DEclare v_id INT;
    	declare cur1  CURSOR  FOR
    		SELECT id  FROM `20231009_sainte_gemmes_en_2035`
    		WHERE Avenir__Cinq_sujets_les_plus_prioritaires LIKE CONCAT('%',(SELECT sp.intitule  from sujets_prioritaires sp WHERE sp.id=v_sp_id),'%');
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
    		OPEN cur1;
    		read_loop: LOOP
    			FETCH cur1 INTO v_id;
    			IF done THEN
    				LEAVE read_loop;
     
    END IF;
    			INSERT INTO lien__personne__sujet_prioritaire VALUES(v_id,v_sp_id);
    		END LOOP read_loop;
    		close cur1;
     
    END $$
     
    drop procedure if exists insert_sujets_importants $$
    CREATE PROCEDURE insert_sujets_importants()
    BEGIN
    	FOR v_sujet_id IN 1..10 DO
    		call sujets_importants(v_sujet_id);
    	END FOR;
    END $$
    DELIMITER ;
     
    call insert_sujets_importants;

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 482
    Points : 19 499
    Points
    19 499
    Par défaut
    Salut à tous.

    Je ne l'ai pas vérifié mais il me semble que l'erreur se situe à cette ligne :
    Il ne faut pas mettre de : devant le =

    @+

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

Discussions similaires

  1. [Python 3.X] Boucle while qui ne fonctionne pas
    Par frederic2710 dans le forum Général Python
    Réponses: 7
    Dernier message: 13/02/2022, 19h02
  2. Une boucle While qui n'est pas exécutée
    Par Nell11 dans le forum C
    Réponses: 3
    Dernier message: 21/11/2020, 21h35
  3. Boucle do loop while qui ne fonctionne pas
    Par nahamed dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/04/2015, 11h52
  4. Une boucle While qui ne fonctionne pas
    Par seremei dans le forum Langage
    Réponses: 6
    Dernier message: 25/10/2012, 11h33
  5. Fonction While {} qui ne fonctionne pas
    Par zoom61 dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2006, 12h17

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