Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando o cursor em um loop de um procedimento armazenado


Você pode fazer o que quiser aninhando o cursor em um BEGIN ... END quadra. Veja "Aninhamento de loops de cursor MySQL" de Roland Bouman artigo para mais detalhes. Pode valer a pena notar seus comentários sobre esta técnica muitas vezes ser desnecessária, pois muitas vezes é possível reescrever a consulta em vez de ter que executar um cursor aninhado.

Se você ainda precisar aninhar seu cursor em um loop, seu código deve ficar assim:
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;