SQL — Тройная вложенность при вставке

#mysql #sql #database #sql-insert

#mysql #sql #База данных #sql-вставка

Вопрос:

У меня есть этот код для вставки строк в таблицу. У меня есть три, пока они не были установлены сами по себе, но этот код дает мне

 error #1064 - bad syntax  close

    BEGIN
            WHILE p <= 5
            BEGIN
                WHILE ra <= 40
            ' on line 7.
  

Что не так с этим кодом?

  DELIMITER $$

CREATE PROCEDURE proc()
BEGIN
    DECLARE r int DEFAULT 1;
    DECLARE p int DEFAULT 1;
    DECLARE ra int DEFAULT 1;
    WHILE r <= 8 DO

        WHILE p <= 5 DO

            WHILE ra <= 40 DO

                INSERT INTO tabulka (REGAL,POLICE,RADA) VALUES(r,p,ra);
                SET ra = ra   1;
            END WHILE;
            SET p = p   1;
        END WHILE;
        SET r = r   1;
    END WHILE;
END$$
DELIMITER ;

CALL proc();
  

введите описание изображения здесь

РЕДАКТИРОВАТЬ: теперь он генерирует только один цикл:
введите описание изображения здесь

Ответ №1:

MySQL использует для этого синтаксис WHILE DO / END WHILE . Итак, хранимая процедура должна выглядеть следующим образом:

 CREATE PROCEDURE proc()
BEGIN
    DECLARE r int DEFAULT 1;
    DECLARE p int DEFAULT 1;
    DECLARE ra int DEFAULT 1;
    WHILE r <= 8 DO
        WHILE p <= 5 DO
            WHILE ra <= 40 DO
                INSERT INTO tabulka (REGAL,POLICE,RADA) VALUES(r,p,ra);
                SET ra = ra   1;
            END WHILE;
            SET p = p   1;
        END WHILE;
        SET r = r   1;
    END WHILE;
END;
  

Вот небольшой рекстест.

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

1. Спасибо, но теперь он генерирует только 40 строк с regal = 1, police = 1 и rada = 1 …. 40, но я хочу сгенерировать regal 1-8 и rada 1-5

2. @adam . . . Это ваш код с исправленными синтаксическими ошибками — это вопрос, который вы задали. Если у вас есть другой вопрос о логике , задайте его как новый вопрос. Тем не менее, я подозреваю, что ваша проблема заключается в том, что вы не повторно инициализируете переменную перед перезапуском каждого цикла.

Ответ №2:

Хорошо, моя ошибка. Я забыл сбросить переменные на 1 после завершения внутренних циклов. Спасибо за помощь.