Curseurs multiples dans les boucles imbriquées dans MySQL
Je souhaite faire quelque chose qui semble un peu compliqué dans MySQL.
En fait, je souhaite ouvrir un curseur, faire une boucle, et dans cette boucle, ouvrir un deuxième curseur à l'aide des données de la précédente, extraction d'être exécuté, et re-boucle sur les résultats.
DECLARE idind INT;
DECLARE idcrit INT;
DECLARE idindid INT;
DECLARE done INT DEFAULT 0;
DECLARE done2 INT DEFAULT 0;
DECLARE curIndicateur CURSOR FOR SELECT id_indicateur FROM indicateur;
DECLARE curCritereIndicateur CURSOR FOR SELECT C.id_critere FROM critere C where C.id_indicateur=idind;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
set idindid=54;
OPEN curIndicateur;
REPEAT
FETCH curIndicateur INTO idind;
open curCritereIndicateur;
REPEAT
FETCH curIndicateur INTO idcrit;
INSERT INTO SLA_DEMANDE_STATUS (iddemande,idindicateur,indicateur_status,progression) values('0009',idcrit,'OK',10.0);
UNTIL done END REPEAT;
close curCritereIndicateur;
UNTIL done END REPEAT;
CLOSE curIndicateur;
En fait, la façon de faire "Jusqu'à faire" différemment pour les deux curseurs, parce que vous ne pouvez déclarer un traiteur pour SQLSTATE?
Si la fin de la première, la deuxième se termine trop.
source d'informationauteur user5537
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de définir un nouveau BLOC à l'intérieur de votre 1er curseur de la boucle et utiliser les différents Déclare dans ce bloc.
Quelque chose comme:
Corrigez-moi si je me trompe, mais il semble que ce que vous essayez de faire est un bloc insérer des enregistrements dans votre "SLA_DEMANDE_STATUS" de la table. Inclure tous les critères pour chaque indicateur et par défaut avec les valeurs de "0009', 'OK' et 10,0 pour chaque indicateur, les Critères de l'ID.
Cela peut être fait en un seul SQL-Insert. INSERT INTO ... à partir de SQL-Select...
Maintenant, si vous voulez de n'inclure qu'une seule "id_indicateur entrée", vous pouvez l'ajouter à la clause where de l'instruction select.
Avis que mon SQL-Select a forcé les valeurs de correspondre avec les colonnes que vous souhaitez avoir rempli. Ils vont tous être inséré dans la table de destination par le même nom. La bonne chose à propos de cela, il vous suffit d'exécuter le SQL-SELECT partie juste pour voir les données que vous ATTENDEZ d'avoir inséré... si sa incorrecte, vous pouvez l'ajuster pour s'adapter à ce que les restrictions que vous voulez.
vous pouvez utiliser la boucle,et de réinitialiser la valeur de la poignée,comme ceci:
Ou la redéfinition de la CONTINUER POIGNÉE:
Il semble que toutes les instructions select à l'intérieur d'une boucle de CONTINUER à exécuter la POIGNÉE