Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation du curseur dans une boucle d'une procédure stockée

Vous pouvez faire ce que vous voulez en imbriquant le curseur dans un BEGIN ... END bloc. Voir L'imbrication des boucles de curseur MySQL de Roland Bouman article pour plus de détails. Il peut être intéressant de noter ses commentaires sur cette technique souvent inutile, car il est souvent possible de réécrire la requête au lieu d'avoir à effectuer un curseur imbriqué.

Si vous avez encore besoin d'imbriquer votre curseur dans une boucle, votre code devrait ressembler à ceci :

increment: LOOP
    block_cursor: BEGIN
        DECLARE cur1 CURSOR FOR SELECT person_id, publication_id  FROM p_publication WHERE person_id = new_count;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        OPEN cur1;
        REPEAT
            FETCH cur1 INTO pub_id, per_id;
            IF NOT done THEN
                INSERT INTO test.t2 VALUES (pub_id, per_id);
            END IF;
            SET new_count = new_count + 1;
        UNTIL done END REPEAT;
        CLOSE cur1;
        IF !(new_count < old_count ) THEN
            LEAVE increment;
        END IF;
    END block_cursor;
END LOOP increment;