Основываясь на других ответах, которые дали некоторое представление, я смог найти дополнительную информацию ( Кевина Беделла ), чтобы создать хранимую процедуру и использовать курсор в цикле.Я упростил свое решение, чтобы оно соответствовало примеру в моем вопросе:
DROP PROCEDURE IF EXISTS proc_item_import;
DELIMITER $$
CREATE PROCEDURE proc_item_import()
BEGIN
# Declare variables to read records from the cursor
DECLARE parent_id_val INT(10) UNSIGNED;
DECLARE item_type_val INT(10) UNSIGNED;
DECLARE quantity_val INT(3);
# Declare variables for cursor and loop control
DECLARE no_more_rows BOOLEAN;
DECLARE item_qty INT DEFAULT 0;
# Declare the cursor
DECLARE item_cur CURSOR FOR
SELECT
i.parent_id, i.qty, i.item_type
FROM items i;
# Declare handlers for exceptions
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
# Open the cursor and loop through results
OPEN item_cur;
input_loop: LOOP
FETCH item_cur
INTO parent_id_val, item_type_val, quantity_val;
# Break out of the loop if there were no records or all have been processed
IF no_more_rows THEN
CLOSE item_cur;
LEAVE input_loop;
END IF;
SET item_qty = 0;
qty_loop: LOOP
INSERT INTO items_new
(parent_id, item_type)
SELECT
parent_id_val, item_type_val;
SET item_qty = item_qty + 1;
IF item_qty >= quantity_val THEN
LEAVE qty_loop;
END IF;
END LOOP qty_loop;
END LOOP input_loop;
END$$
DELIMITER ;
Прежде чем задавать этот вопрос, я не использовал хранимые процедуры, курсоры или циклы.Тем не менее, я читал и часто сталкивался с ними на SE и в других местах, и это была хорошая возможность узнать
Возможно, стоит отметить, что пример на странице Кевина (ссылка выше) не использует END%%
(просто END
), что вызвало головную боль при попытке заставить скрипт работать.При создании процедуры необходимо временно изменить разделитель, чтобы точки с запятой завершали операторы внутри процедуры, но не процесс создания самой процедуры.