У меня есть хранимая процедура, в которой есть while, и в это время мне нужно создать представление из динамического оператора SQL.Для первой итерации мое представление содержит хороший результат, но последующие итерации всегда имеют основной результат, а не строки, соответствующие новому подготовленному оператору ...
Если я заменю WHILE на 2x, представление создания с различными значениями@a, результаты ожидаемые.Кажется, проблема в подготовленном утверждении для while ...
DROP PROCEDURE IF EXISTS bug;
DELIMITER |
CREATE PROCEDURE bug()
BEGIN
DECLARE a INT(1);
DECLARE s VARCHAR(100) DEFAULT '';
SET @a = 1;
WHILE @a <= 2 DO
SET @s = concat('CREATE OR REPLACE VIEW bugview as SELECT ',@a,';');
select concat('@s=',@s);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
select @a;
select * from bugview;
set @a = @a + 1;
END WHILE;
END|
DELIMITER ;
Неправильный результат (в последней таблице ожидаемое значение должно быть 2, а не 1):
+------------------------------------------------+
| concat('@s=',@s) |
+------------------------------------------------+
| @s=CREATE OR REPLACE VIEW bugview as SELECT 1; |
+------------------------------------------------+
1 row in set (0.00 sec)
+------+
| @a |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)
+------------------------------------------------+
| concat('@s=',@s) |
+------------------------------------------------+
| @s=CREATE OR REPLACE VIEW bugview as SELECT 2; |
+------------------------------------------------+
1 row in set (0.01 sec)
+------+
| @a |
+------+
| 2 |
+------+
1 row in set (0.02 sec)
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.02 sec)