Formation PUB200 : MySQL, 2018 Les curseurs

18.5 Curseurs imbriqués


Dans certains cas, on aura besoin d'imbriquer deux curseurs pour arriver à nos fins. Ce serait le cas, par exemple, si on voulait faire un traitement sur tous les enregistrements d'une table en les traitant selon une clé étrangère, pour toutes les valeurs de clé étrangère possible.

Dans la BD garage, on aurait besoin d'imbriquer des curseurs si on souhaitait ajouter une note pour chaque facture relative à une des voitures d'un client donné. Le premier curseur bouclera dans les voitures du client et le second bouclera dans les factures pour une voiture donnée.

Le code de la procédure stockée aura donc la forme suivante :

MySQL

CREATE PROCEDURE ...()

BEGIN 

    -- entête standard 

  

    -- déclaration de variables locales 

    DECLARE l_voiture_id INT; 

    DECLARE l_facture_id INT; 

  

    DECLARE mysql_errno INT; 

    DECLARE message_text TEXT;
 
    DECLARE fini BOOL;
    ...
 
    -- curseur pour la grande boucle
    DECLARE c_voitures CURSOR FOR SELECT id FROM voitures;   
 
    -- curseur pour la petite boucle
    DECLARE c_factures CURSOR FOR SELECT id FROM factures WHERE voiture_id = l_voiture_id;
 
    -- les deux curseurs partageront les mêmes gestionnaires
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini=1;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ...
 
    -- traitement
    ...
    SET fini = 0
 
    -- ***** grande boucle *****
    OPEN c_voitures;
 
    WHILE NOT fini DO
        FETCH c_voitures INTO l_voiture_id;
        ...
 
        IF NOT fini THEN
            ...
 
            -- ***** petite boucle *****
            OPEN c_factures;   -- tiendra compte du l_voiture_id initialisé plus haut
 
            WHILE NOT fini DO
                FETCH c_factures INTO l_facture_id;
                ...
                IF NOT fini THEN
                    ...
                END IF;
 
            END WHILE;
 
            CLOSE c_factures;
            SET fini = 0;   -- pour permettre à la grande boucle de continuer
 
        END IF;
 
    END WHILE;
 
    CLOSE c_voitures;
END$$

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre