MySQL While Statement выдает ошибку и вставляет только одну запись NULL - PullRequest
0 голосов
/ 04 февраля 2019

Я думаю, что делаю что-то не так с написанием оператора WHILE в приведенном ниже скрипте mysql.Я протестировал каждый отдельный компонент приведенного ниже кода, и все работает изолированно (нет ошибок, выданных тестовым выводом, совпадающим с ожидаемым), кроме WHILE (выдает ошибку и вводит только значения NULL и проходит только одну итерацию цикла).Я следую https://dev.mysql.com/doc/refman/5.7/en/while.html задокументированным инструкциям, но мне, кажется, что-то не хватает.Я хочу вставить несколько записей (миллионов) в эту таблицу.Что я делаю неправильно?Почему этот оператор WHILE не зациклен и почему он вставляет только значения NULL?

Источник

USE wordpress;
SET @i := 0;

WHILE @i < 10 DO
    SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR);
    SELECT @rand_value as CONCAT('rand_value at ', CAST(@i as CHAR));
    INSERT INTO wp_wpdatatable_1 (jiraissue, assignee, testcasename, description, image, automation, testresult, date, status, priority, os, testtype, location, flavor) 
    VALUES 
    (CONCAT('TEST ISSUE ', @rand_value)
    , CONCAT('ASSIGNEE ', @rand_value)
    , CONCAT('TEST CASE NAME ', @rand_value)
    , CONCAT('DESCRIPTION ', @rand_value)
    , CONCAT('IMAGE ', @rand_value)
    , CONCAT('AUTOMATION ', @rand_value)
    , CONCAT('TESTRESULT ', @rand_value)
    , CONCAT('DATE ', @rand_value)
    , CONCAT('STATUS ', @rand_value)
    , CONCAT('PRIORITY ', @rand_value)
    , CONCAT('OS ', @rand_value)
    , CONCAT('TESTTYPE ', @rand_value)
    , CONCAT('LOCATION ', @rand_value)
    , CONCAT('FLAVOR ', @rand_value));
    SET @i := @i + 1;
END WHILE;

Выход

mysql> source /root/populate_wp_wpdatatable_1.sql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
Query OK, 0 rows affected (0.00 sec)

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHILE @i < 10 DO
    SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR)' at line 1
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('rand_value at ', CAST(@i as CHAR))' at line 1
Query OK, 1 row affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END WHILE' at line 1

Что-то странное в том, что в выводе вы видите «1 строка затронута».Таким образом, он действительно проходит ОДНУ итерацию цикла WHILE, но он делает это только один раз и добавляет в таблицу только значения NULL.Надеюсь, кто-то может определить, что мне не хватает.Заранее спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

Так что было несколько вещей не так.Во-первых, как заметил @Barmar, операторы WHILE работают только в хранимых процедурах.Кроме того, как он указал, мой выбор был неправильным (но также бессмысленным, поэтому я удалил его).Была еще одна вещь, которая нужна.Так как вам нужно создать хранимую процедуру, вам также нужно установить DELIMITER в значение, отличное от ; .Ниже приведен правильный код.

DELIMITER $$
CREATE PROCEDURE populate_wp_wpdatatable_1(x INT)
BEGIN
    SET @i = 0;
    WHILE @i < x DO
          SET @rand_value = CAST(FLOOR(RAND()*10000) as CHAR);
          INSERT INTO wp_wpdatatable_1 (jiraissue, assignee, testcasename, description, image, automation, testresult, date, status, priority, os, testtype, location, flavor) 
          VALUES 
          (CONCAT('TEST ISSUE ', @rand_value)
          , CONCAT('ASSIGNEE ', @rand_value)
          , CONCAT('TEST CASE NAME ', @rand_value)
          , CONCAT('DESCRIPTION ', @rand_value)
          , CONCAT('IMAGE ', @rand_value)
          , CONCAT('AUTOMATION ', @rand_value)
          , CONCAT('TESTRESULT ', @rand_value)
          , NOW() - INTERVAL FLOOR(RAND() * 365) DAY
          , CONCAT('STATUS ', @rand_value)
          , CONCAT('PRIORITY ', @rand_value)
          , CONCAT('OS ', @rand_value)
          , CONCAT('TESTTYPE ', @rand_value)
          , CONCAT('LOCATION ', @rand_value)
          , CONCAT('FLAVOR ', @rand_value));
          SET @i = @i + 1;
    END WHILE;
END;
$$
DELIMITER ;

Итак, забавные вещи.Еще раз спасибо @Barmar за помощь.

...