Il n'est pas permis d'utiliser une instruction_préparée DEFINE cur CURSOR FOR, vous devez définir une instruction SQL valide. La bonne nouvelle est que vous pouvez définir le curseur sur une vue qui peut être créée dynamiquement ultérieurement. Par exemple...
DROP PROCEDURE IF EXISTS my_dynamic_proc;
DELIMITER //
CREATE PROCEDURE my_dynamic_proc(tablename varchar(64), fieldname varchar(64), country VARCHAR(64))
BEGIN
DECLARE adr_value varchar(500);
DECLARE done BOOLEAN DEFAULT FALSE;
-- Cursor definition
DECLARE cur1 CURSOR FOR SELECT address FROM tmp_view_address;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Dynamic view definition and creation
SET @v = concat('CREATE OR REPLACE VIEW tmp_view_address as SELECT `',fieldname,'` as address FROM ',tablename,' WHERE country_name = "',country,'" group by 1 order by count(1) desc');
PREPARE stm FROM @v;
EXECUTE stm;
DEALLOCATE PREPARE stm;
-- Open cursor
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO adr_value;
IF done THEN
LEAVE read_loop;
END IF;
-- Basic output result
SELECT concat("My address is ",adr_value);
-- Use every result in a dynamic update
SET @u = concat('update ',tablename,' set new_field_address = "',adr_value,'" where country_name = "',country,'" and new_field_address is null');
PREPARE stm FROM @u;
EXECUTE stm;
DEALLOCATE PREPARE stm;
END LOOP;
CLOSE cur1;
END//
DELIMITER ;