Mon SQL:
CREATE PROCEDURE INV_MIN_PURCHASE_PRICE() BEGIN DECLARE done INT; DECLARE current_inventory_ID INT; DECLARE cur1 CURSOR FOR SELECT inventory_ID FROM _inventory; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET done = 0; OPEN cur1; REPEAT FETCH cur1 INTO current_inventory_ID; UPDATE _debug SET rows=rows+1; UNTIL done END REPEAT; CLOSE cur1; END;
3 Réponses :
Avez-vous essayé une boucle au lieu de la construction de répétition? Semble fonctionner mieux dans MySQL. Remplacez la section REPEAT à la section de répétition d'extrémité avec:
inv_loop: LOOP FETCH cur1 INTO current_inventory_ID; IF done = 1 THEN LEAVE inv_loop; END IF; UPDATE _debug SET rows=rows+1; END LOOP;
J'ai essayé ceci à la première place (en basant sur l'exemple dans MySQL Docs). Sans succès.
Je suppose que si vous essayez simplement de sélectionner Inventory_id à partir de _Inventory dans la console MySQL, vous obtenez plus d'une ligne de retour, non?
Bien sûr. J'ai déjà corrigé le problème. Mise à jour MySQL Server à la version la plus récente et maintenant le code fonctionne bien.
Je viens d'avoir le même problème avec une procédure stockée dans MySQL. Il était censé obtenir tous les enregistrements d'une table ayant une valeur nulle dans une certaine colonne, puis remplissez cette valeur d'une autre table. Cependant, il s'est arrêté après un enregistrement:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; [...] select id into newValue from B where ... SET done = FALSE; [...]
C'est la bonne approche: Ajout: Il est évidemment possible de passer sans une deuxième variable en réinitialisant simplement le "Terminé" après le SELECT i>. Propre et simple
IF done THEN LEAVE main_loop; ELSE ITERATE main_loop; END IF;
belle question .. alors quelle est la solution