Просмотр создания с подготовленным утверждением в то время как кажется, не работает должным образом - PullRequest
2 голосов
/ 11 июля 2019

У меня есть хранимая процедура, в которой есть 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)
...