Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo del cursore in un ciclo di una procedura memorizzata

Puoi fare quello che vuoi annidando il cursore in un BEGIN ... END bloccare. Vedi "Nesting MySQL Cursor Loops" di Roland Bouman articolo per maggiori dettagli. Potrebbe valere la pena notare che i suoi commenti su questa tecnica spesso non sono necessari, poiché spesso è possibile riscrivere la query invece di dover eseguire un cursore nidificato.

Se hai ancora bisogno di annidare il cursore in un ciclo, il tuo codice dovrebbe assomigliare a questo:

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;