Partage
  • Partager sur Facebook
  • Partager sur Twitter

Update d'un curseur

    7 novembre 2017 à 12:22:51

    Bonjour à tous 

    je viens chercher un peu d'aide je souhaite faire changer le résultat des champs d'une colonne en fonction du résultat d'un curseur exemple si résultat_curseur = 1 alors champ1 colonne1 = 'le livreur a encaisser' ensuite si résultat_curseur = 0 alors champ2 colonne1 = 'le livreur n'a pas encaissé' j'ai donc fait ceci : 

    DELIMITER |
    CREATE PROCEDURE p_statut_encaissement ()
    BEGIN
     DECLARE v_encaissement INT DEFAULT 0;
    DECLARE fin BOOLEAN DEFAULT FALSE ;
    DECLARE curs_livree CURSOR
     FOR SELECT livree
    FROM commande;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;
    OPEN curs_livree;
    loop_curseur: LOOP
     FETCH curs_livree INTO v_encaissement;
    IF fin THEN
     LEAVE loop_curseur;
    END IF;
    CASE
     WHEN v_encaissement = 0 THEN
     UPDATE livreur SET encaissement = 'livreur pas encaissé';
    WHEN v_encaissement = 1 THEN
     UPDATE livreur SET encaissement = 'livreur à encaisser';
    ELSE
     UPDATE livreur SET encaissement = 'etat inconnu';
    END CASE;
    END LOOP;
    CLOSE curs_livree;
    END |





     Tout se passe bien sauf l'update dans le case qui me met toute la colonne à 1 dans la table livreur. 

    Si quelqu'un pourrait me dire si qui cloche ? merci d'avance 

    -
    Edité par Romainromss 7 novembre 2017 à 13:39:44

    • Partager sur Facebook
    • Partager sur Twitter
      7 novembre 2017 à 17:04:29

      Bonjour,

      Romainromss a écrit:

      Tout se passe bien sauf l'update dans le case qui me met toute la colonne à 1 dans la table livreur. 

      C'est ce que tu lui demandes de faire, il n'y a pas de clause WHERE dans ton UPDATE ...

      Je suppose que dans ta table commande tu dois avoir une colonne identifiant (genre id) et que dans la table livreur tu dois avoir une référence à cette commande (genre id_commande). Il te faut donc inclure cette colonne dans le curseur et l'utiliser pour ton UPDATE.

      DELIMITER |
      CREATE PROCEDURE p_statut_encaissement ()
      BEGIN
      	DECLARE v_encaissement INT DEFAULT 0;
      	DECLARE v_libelle VARCHAR(30) DEFAULT '';
      	DECLARE fin BOOLEAN DEFAULT FALSE;
      	
      	DECLARE curs_livree CURSOR FOR
      		SELECT id, livree
      		FROM commande;
      	DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;
      	
      	OPEN curs_livree;
      	
      	loop_curseur: LOOP
      		FETCH curs_livree INTO v_id, v_encaissement;
      		
      		IF fin THEN
      			LEAVE loop_curseur;
      		END IF;
      		
      		CASE
      			WHEN v_encaissement = 0 THEN
      				v_libelle = 'livreur pas encaissé';
      			WHEN v_encaissement = 1 THEN
      				v_libelle = 'livreur à encaisser'
      			ELSE
      				v_libelle = 'etat inconnu';
      		END CASE;
      		
      		UPDATE livreur
      		SET encaissement = 'etat inconnu'
      		WHERE id = v_id;
      		
      	END LOOP;
      	
      	CLOSE curs_livree;
      END |

      J'ai rajouté une colonne id dans le curseur, que je fetch dans une variable v_id.

      Pour éviter d'écrire 3 fois le UPDATE, le CASE renseigne une variable v_libelle que l'on utilise une seule fois en fin de boucle ...

      Après une commande est peut-être affectée à un livreur (genre une colonne id_livreur dans la table commande) donc à adapter à ton modèle ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      Update d'un curseur

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown