sql >> Databasteknik >  >> RDS >> Mysql

MySQL lagrad procedurmarkör för förberedda uttalanden

Jag har några dåliga och goda nyheter till dig.

Först de dåliga nyheterna.

Så det finns inga dynamiska markörer än så länge... Här skulle du behöva något liknande.

Men nu är de goda nyheterna:det finns åtminstone två sätt att kringgå det - med vw eller tbl.

Nedan skrev jag om din kod och använde vyn för att göra "dynamisk" markör.

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 ;

Och för att testa proceduren:

CALL myproc('people_en');


  1. SQL Server Error 213:Kolumnnamn eller antal angivna värden matchar inte tabelldefinitionen.

  2. Är det något fel med joins som inte använder JOIN-nyckelordet i SQL eller MySQL?

  3. MySQL visar alla datum mellan intervallet

  4. Android Sqlite vid uppgradering av raderingstabell från databasen