sql >> Base de Datos >  >> RDS >> Mysql

Uso del cursor en un bucle de un procedimiento almacenado

Puedes hacer lo que quieras anidando el cursor en un BEGIN ... END cuadra. Consulte "Anidación de bucles de cursor MySQL" de Roland Bouman artículo para más detalles. Puede valer la pena señalar sus comentarios acerca de que esta técnica a menudo es innecesaria, ya que a menudo es posible reescribir la consulta en lugar de tener que realizar un cursor anidado.

Si aún necesita anidar su cursor en un bucle, su código debería verse así:

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;