sql >> Database >  >> RDS >> Mysql

MySQL-cursor voor opgeslagen procedures voor voorbereide instructies

Ik heb slecht en goed nieuws voor je.

Eerst het slechte nieuws.

Er zijn dus tot nu toe geen dynamische cursors... Hier zou je zoiets nodig hebben.

Maar nu het goede nieuws:er zijn minstens twee manieren om het te omzeilen - met vw of tbl.

Hieronder heb ik je code herschreven en de weergave toegepast om een ​​'dynamische' cursor te maken.

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 ;

En om de procedure te testen:

CALL myproc('people_en');


  1. Prestatieproblemen:de eerste ontmoeting

  2. Een gids voor het begrijpen van schaalpatronen voor databases

  3. Hoe gegevens in MySQL in te voegen met een automatisch verhoogde primaire sleutel?

  4. Krijg alle kinderen op ouder-ID en waar-clausule in mysql