MySQL вставить несколько строк с функцией с циклом while

#mysql #database #function #while-loop

#mysql #База данных #функция #цикл while

Вопрос:

Я пытаюсь вставить несколько строк в базу данных MySQL. Сначала я создаю функцию insert для address, которая подключается к другой таблице, содержащей только форматированный адрес, поэтому я делаю вставки для нее в другой функции.

Затем в третьей функции я пытаюсь заполнить третью таблицу, предварительно сгенерировав для нее фиктивные адреса. По какой-то причине даже функция первого более низкого уровня (address_insert()) не выполняется из-за синтаксической ошибки SQL, и я не могу понять, что это может быть. Есть идеи?

Спасибо! Первая функция:

 DROP PROCEDURE IF EXISTS address_insert;
CREATE PROCEDURE address_insert()
BEGIN
DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address)   1;
DECLARE counter INT DEFAULT 0;

WHILE (counter < 5) DO 
INSERT INTO hoop.address (adr_id, address, city, country, created_at, lat, lng, updated_at, zip)
VALUES                   (i, CONCAT("Address-", i), "City", "United States", CURRENT_TIMESTAMP, RAND(35, 50), RAND(80, 120), CURRENT_TIMESTAMP, "ZIPCODE");

    SET i = i   1;
    SET counter = counter   1; 
END WHILE;
END;
  

Вторая функция:

 DROP PROCEDURE IF EXISTS address_shop_insert;
CREATE PROCEDURE address_shop_insert()
BEGIN
DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address_shop)   1;
DECLARE counter INT DEFAULT 0;

WHILE (counter <= SELECT COUNT(*) FROM hoop.address) DO 
INSERT INTO hoop.address_shop_insert (formatted_address, adr_id)
VALUES                               ("Formatted Address", i);

SET i = i   1;
SET counter = counter   1; 
END WHILE;
END;
  

Заключительная функция:

 DROP PROCEDURE IF EXISTS merchant_shop_insert;
CREATE PROCEDURE merchant_shop_insert()
BEGIN
address_insert()
address_shop_insert()

DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.merchant_shop)   1; 
DECLARE merchant_accounts INT DEFAULT (SELECT COUNT(*) FROM hoop.merchant_account)   1;
DECLARE shop_address_id DEFAULT (SELECT COUNT(*) FROM hoop.address_shop) - 5;
DECLARE counter INT DEFAULT 1;
DECLARE account_mod INT DEFAULT 0;
DECLARE account_id INT DEFAULT 1;

WHILE (i < merchant_accounts) DO
 IF 
    SELECT MOD(account_mod, 5) = 0
    SET account_id = account_id   1;
 END IF;

 IF counter = 5
    SET shop_address_id = shop_address_id   1;
    SET counter = 1;
 END IF;

  INSERT INTO hoop.merchant_shop (shop_id, contact_name, contact_phone, created_at, shop_name, status, updated_at, acc_id, shop_adr_id) 
  VALUES (i, "Strawberry Peach", " 361/789-6544", CURRENT_TIMESTAMP, CONCAT("Shop", i), 1, CURRENT_TIMESTAMP, account_id, shop_address_id)

  SET i = i   1;
  SET account_mod = account_mod   1;
  SET counter = counter   1;
END WHILE;
END;
  

Ответ №1:

Поскольку команда заканчивается точкой с запятой ; , вам необходимо определить конкретную для создания хранимой процедуры, иначе MySQL не будет знать, какой разделитель указывает на конец объявления процедуры.

 DROP PROCEDURE IF EXISTS address_insert;    

-- Set the delimiter to $$
DELIMITER $$

-- Notice that every instructions IN the procedure will be ended by the regular delimiter ;
CREATE PROCEDURE address_insert()
BEGIN
    DECLARE i INT DEFAULT (SELECT COUNT(*) FROM hoop.address)   1;
    DECLARE counter INT DEFAULT 0;

    WHILE (counter < 5) DO 
        INSERT INTO hoop.address (adr_id, address, city, country, created_at, lat, lng, updated_at, zip)
        VALUES                   (i, CONCAT("Address-", i), "City", "United States", CURRENT_TIMESTAMP, RAND(35, 50), RAND(80, 120), CURRENT_TIMESTAMP, "ZIPCODE");

        SET i = i   1;
        SET counter = counter   1; 
    END WHILE;
-- vv------------------------ Notice this
END$$

-- Set it back to ;
DELIMITER ;
  

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

1. Спасибо, к сожалению, это не устранило синтаксическую ошибку.