Има обаче 2 начина.
Първият е за случаите, когато абсолютно само един потребител в даден момент ще изпълнява процедурата. Изявление за подготовка може да се използва за създаване на изглед с динамичния SQL и курсорът може да избира от този изглед със статично име. Няма почти никакво влияние върху производителността. За съжаление, тези изгледи са видими и за други потребители (няма такова нещо като временен изглед), така че това няма да работи за множество потребители.
Аналогично, временна таблица може да бъде създадена в изявлението за подготовка и курсорът може да избира от временната таблица. Само текущата сесия може да види временна таблица, така че проблемът с множество потребители е разрешен. Но това решение може да има значително въздействие върху производителността, тъй като трябва да се създава временна таблица всеки път, когато процедурата се изпълнява.
В крайна сметка:Все още имаме нужда от курсори, за да можем да се създават динамично!
Ето пример за използване на изглед за предаване на името на таблицата и името на колоната в курсора от 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 ;