9
votes

MySQL curseur récupérant une seule rangée

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;


1 commentaires

belle question .. alors quelle est la solution


3 Réponses :


0
votes

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;


3 commentaires

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.



15
votes

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;

           [...]


1 commentaires

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 . Propre et simple



0
votes
IF done THEN
         LEAVE main_loop;
ELSE
         ITERATE main_loop;
END IF;

0 commentaires