#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.html2. Смотрите пример в справочном руководстве 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;