Tôi có một số tin xấu và tốt cho bạn.
Đầu tiên là tin xấu.
Vì vậy, không có con trỏ động nào cho đến nay ... Ở đây bạn sẽ cần một cái gì đó như thế này.
Nhưng bây giờ tin tốt là:có ít nhất hai cách để vượt qua nó - sử dụng vw hoặc tbl.
Dưới đây, tôi đã viết lại mã của bạn và chế độ xem được áp dụng để tạo con trỏ 'động'.
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 ;
Và để kiểm tra quy trình:
CALL myproc('people_en');