sql >> Databáze >  >> RDS >> Mysql

Kurzor uložené procedury MySQL pro připravené příkazy

Mám pro vás špatnou a dobrou zprávu.

Nejprve špatné zprávy.

Takže zatím žádné dynamické kurzory nejsou... Tady byste potřebovali něco takového.

Ale teď ta dobrá zpráva:jsou minimálně dva způsoby, jak to obejít - pomocí vw nebo tbl.

Níže jsem přepsal váš kód a použil zobrazení, aby se vytvořil „dynamický“ kurzor.

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 ;

A otestovat postup:

CALL myproc('people_en');


  1. Změňte sloupec MySQL tak, aby byl AUTO_INCREMENT

  2. Typy kurzoru SQL Server – pouze vpřed statický kurzor | Kurz SQL Server / Kurz TSQL

  3. Databáze:Zřetězené funkce

  4. Aktualizujte více sloupců v příkazu MERGE ORACLE