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

MySQL-Cursor für gespeicherte Prozeduren für vorbereitete Anweisungen

Ich habe schlechte und gute Nachrichten für dich.

Zuerst die schlechte Nachricht.

Es gibt also bisher keine dynamischen Cursor... Hier bräuchte man so etwas.

Aber jetzt die gute Nachricht:Es gibt mindestens zwei Möglichkeiten, es zu umgehen - mit vw oder tbl.

Unten habe ich Ihren Code umgeschrieben und die Ansicht angewendet, um einen "dynamischen" Cursor zu erstellen.

DELIMITER //

DROP PROCEDURE IF EXISTS myproc;
CREATE PROCEDURE myproc(IN lang VARCHAR(400))

BEGIN

    DECLARE c VARCHAR(400);
    DECLARE done BOOLEAN DEFAULT FALSE;
    DECLARE cur CURSOR FOR SELECT name FROM vw_myproc;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET @select = concat('CREATE VIEW vw_myproc as SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;

    SET @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;

    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
          OPEN cur;
          read_loop: LOOP
            FETCH cur INTO c;
            IF done THEN
              LEAVE read_loop;
            END IF;

            #HERE YOU CAN DO STH WITH EACH ROW e.g. UPDATE; INSERT; DELETE etc
            SELECT c;

          END LOOP read_loop;
          CLOSE cur;
          DROP VIEW vw_myproc;
    ELSE
        SET c = '';
    END IF;

END//

DELIMITER ;

Und um das Verfahren zu testen:

CALL myproc('people_en');