Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von Cursor in einer Schleife einer gespeicherten Prozedur

Sie können tun, was Sie wollen, indem Sie den Cursor in ein BEGIN ... END verschachteln Block. Siehe Roland Boumans "Nesting MySQL Cursor Loops" Artikel für weitere Details. Es kann erwähnenswert sein, dass seine Kommentare zu dieser Technik oft unnötig sind, da es oft möglich ist, die Abfrage neu zu schreiben, anstatt einen verschachtelten Cursor ausführen zu müssen.

Sollten Sie Ihren Cursor dennoch in einer Schleife verschachteln müssen, sollte Ihr Code etwa so aussehen:

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;