Existují však 2 způsoby.
První je pro případy, kdy bude proceduru spouštět absolutně pouze jeden uživatel. Příkaz Prepare lze použít k vytvoření pohledu s dynamickým SQL a kurzor může vybírat z tohoto staticky pojmenovaného pohledu. Nemá to téměř žádný vliv na výkon. Bohužel tato zobrazení jsou viditelná i pro ostatní uživatele (neexistuje nic takového jako dočasné zobrazení), takže to nebude fungovat pro více uživatelů.
Analogicky lze v příkazu Prepare vytvořit dočasnou tabulku a kurzor vybrat z dočasné tabulky. Dočasnou tabulku vidí pouze aktuální relace, takže problém s více uživateli je vyřešen. Toto řešení však může mít významný dopad na výkon, protože při každém spuštění proc musí být vytvořena dočasná tabulka.
Sečteno a podtrženo:Stále potřebujeme kurzory, abychom je mohli vytvářet dynamicky!
Zde je příklad použití zobrazení k předání názvu tabulky a názvu sloupce do kurzoru z fóra mysql
DELIMITER //
DROP PROCEDURE IF EXISTS test_prepare//
CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50))
BEGIN
DECLARE cursor_end CONDITION FOR SQLSTATE '02000';
DECLARE v_column_val VARCHAR(50);
DECLARE done INT DEFAULT 0;
DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw;
DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1;
SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename);
select @query;
PREPARE stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN cur_table;
FETCH cur_table INTO v_column_val;
WHILE done = 0 DO
SELECT v_column_val;
FETCH cur_table INTO v_column_val;
END WHILE;
CLOSE cur_table;
DROP VIEW test_prepare_vw;
END;
//
DELIMITER ;