Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kursor procedury składowanej MySQL dla przygotowanych instrukcji

Mam dla ciebie złe i dobre wieści.

Najpierw złe wieści.

Więc jak dotąd nie ma dynamicznych kursorów... Tutaj potrzebujesz czegoś takiego.

Ale teraz dobra wiadomość:istnieją co najmniej dwa sposoby na ominięcie tego - za pomocą vw lub tbl.

Poniżej przepisałem Twój kod i zastosowany widok, aby uczynić kursor „dynamicznym”.

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 ;

Aby przetestować procedurę:

CALL myproc('people_en');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki typ MySQL jest najbardziej odpowiedni dla kolumny ceny?

  2. Ruby mysql2 klejnot skompilowany dla niewłaściwej wersji biblioteki klienta mysql

  3. MySQL SUM() podając nieprawidłową sumę

  4. autouzupełnianie pokazuje wszystkie wpisy, nie wykonuje żadnego wyszukiwania

  5. MySQL - Unikalny klucz obcy