Синтаксическая ошибка SQL Mariadb при увеличении переменной в цикле while

#while-loop #mariadb

#в то время как-цикл #мариадб

Вопрос:

У меня есть база данных MariaDB со списком хранимых сайтов и их хронологией (например, с 1 по 5 век н. э.). Мне нужно экспортировать таблицу всех сайтов, активных в 1-м c., во 2-м c. и т. Д. Я хотел избежать экспорта отдельных таблиц для отдельных столетий, а затем их объединения, потому что я часто добавляю новые сайты и использую этот экспортированный файл .csv для выполнения некоторых действий в R.

Я думал создать цикл WHILE для создания одной таблицы, но я получаю эту ошибку:

[42000][1064] (conn=4) У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на правильный синтаксис для использования рядом с «SET Counter = Счетчик 1»; [42000][1064] У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на правильный синтаксис для использования рядом с «SET Counter = Счетчик 1; КОНЕЦ В то время КАК; КОНЕЦ» в строке 17

Код, который я использую, это:

 CREATE PROCEDURE while_centuries() BEGIN  DECLARE Counter INT DEFAULT -1;   WHILE Counter lt;= 11 DO  SELECT site_list.site_code, site_name, st.type_name, cl.culture_type, startcentury, endcentury, site_altitude,  geo_name, x,y, regions.region_name, available_data, bot, zoo, poll -- BOT ZOO POLL are links to the UUIDs of the rows of plant_remains, pollen_remains and faunal_remains table. FROM site_list  INNER JOIN regions ON site_list.region_id = regions.region_id INNER JOIN geo_type gt on site_list.geo_feature = gt.geo_id INNER JOIN site_type st on site_list.site_type = st.type_id INNER JOIN culture_list cl on site_list.culture = cl.id_culture WHERE startcentury lt;=Counter AND endcenturygt;=Counter   SET Counter = Counter   1;   END WHILE;  

где 11-это последний век, который мне нужен, а -1-это первый век, который мне нужен.

Мне жаль, что я плохо разбираюсь в программировании. Кто-нибудь может мне помочь?

Заранее спасибо.

Ответ №1:

Я думаю, что вам нужна точка с запятой после endcenturygt;=Counter , чтобы закончить инструкцию SELECT.

Это НЕ SET Counter = Counter 1 утверждение на самом деле вызывает ошибку.

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

1. Я попытался это сделать, но это дает мне еще одну ошибку gt; [42000][1064] (conn=4) У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на наличие правильного синтаксиса для использования рядом ‘ОБЪЯВИТЬ счетчик INT ПО УМОЛЧАНИЮ -1; [42000][1064] У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на наличие правильного синтаксиса для использования рядом ‘ОБЪЯВИТЬ счетчик INT ПО УМОЛЧАНИЮ -1; В то время как счетчик gt;

2. Присмотревшись повнимательнее, я думаю, что у вас несколько проблем с синтаксисом. Проверьте следующие вещи: 1) используются ли точки с запятой внутри НАЧАЛА и КОНЦА? 2) вы возвращаете некоторые данные…. но в цикле. Что вы делаете с этими возвращаемыми данными на каждой итерации цикла? Каждый раз, когда вы выбираете, вы получаете новый «результирующий набор» данных из базы данных. Если вы ВЫБЕРЕТЕ снова, вы получите другой набор результатов (для нового века), но этот первый набор данных уже исчез….

3. Вы правы, я думал, что смогу получить таблицу, включающую каждое столетие, но, возможно, цикл while просто воссоздаст таблицу в каждом цикле. Как вы думаете, цикл «время» — это еще тот путь, по которому нужно идти?