Цикл While для изменения имени таблицы разделов в MYSQL

#mysql #while-loop

#mysql #цикл while

Вопрос:

Я хочу изменить имя разделенной таблицы, используя цикл while.

 DELIMITER $$
drop procedure if exists dowhile$$
CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 0;
  WHILE v1<10 DO
    SET @pp=concat('p',v1);
    select @pp;
    SET v1 = v1   1;
  END WHILE;
END$$
DELIMITER ;

#OUTPUT
p0
p1
p2
p3
p4
p5
p6
p7
p8
p9
  

В этом скрипте он выводит правильное имя раздела, но когда я хочу использовать переменную в качестве имени раздела, изменив запрос ниже, ошибка указывает на ошибку в синтаксисе SQL рядом с переменной.

 select count(*) from KJ.MAIN_TABLE partition(@pp);
  

Комментарии:

1. имя раздела является идентификатором в SQL, точно так же, как имя таблицы является идентификатором . Идентификаторы должны быть включены в текст SQL. Идентификаторы не могут быть предоставлены в виде значений в инструкции SQL. ( @pp это определяемое пользователем значение, которое содержит значение ). Чтобы получить значения, включенные в текст SQL, мы могли бы создать текст SQL в виде строки, а затем выполнить эту строку как динамический SQL с помощью PREPARE, EXECUTE, DEALLOCATE . Ссылка: dev.mysql.com/doc/refman/5.7/en/prepare.html

2. Смотрите пример в справочном руководстве MySQL «Вот дополнительный пример, который демонстрирует, как выбрать таблицу, для которой выполняется запрос во время выполнения «, dev.mysql.com/doc/refman/5.7/en/sql-prepared-statements.html

3. Хороший момент @spencer7593, понял.

4. «Решение» должно быть опубликовано как ответ, а не как редактирование вопроса. Это нормативный протокол для StackOverflow…

Ответ №1:

РЕШЕНИЕ

С помощью Prepare, Execute и Deallocate. У меня правильный синтаксис

 SET @query=concat('select count(*) from KJ.MAIN_TABLE partition(',@pp,')');
prepare stmt1 from @query;
execute stmt1;
DEALLOCATE PREPARE stmt1;