Здравствуйте, я хочу добиться результата вызова check_shipments;
Определения таблицы:
Как мне выполнить указанную хранимую процедуру с помощью курсоров, используя этот код: Подскажите, пожалуйста, что мне изменить в коде?
DELIMITER $$
CREATE PROCEDURE check_shipments()
BEGIN
DECLARE no_more_products int DEFAULT 0;
DECLARE p_id int DEFAULT 0;
DECLARE ship_times int DEFAULT 0;
DECLARE cur_shipments CURSOR FOR
SELECT prod_id FROM shipments;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_products = 1;
CREATE table IF NOT EXISTS products_Info(prod_id int, prod_shipments int);
OPEN cur_shipments;
FETCH cur_shipments INTO p_id;
REPEAT
SELECT count(prod_id) INTO ship_times FROM shipments where prod_id = p_id;
IF ship_times > 0 THEN
INSERT INTO products_Info VALUES(p_id, ship_times);
END IF;
FETCH cur_shipments INTO p_id;
UNTIL no_more_products = 1 END REPEAT;
CLOSE cur_shipments;
SELECT * FROM products_Info;
drop table products_Info;
END $$
DELIMITER ;
Но результат моей хранимой процедуры таков:
Помощь очень приветствуется, так как я все еще новичок в изучении базы данных.
Мы не работаем с фотографиями. meta.stackoverflow.com/questions/333952/…
@Kendle Я добавил определения таблиц
Вы снова добавляете фотографии. Вы хотите, чтобы мы распознали кодовый текст? Опубликуйте все это как хорошо отформатированный текстовый код SQL и таблицы. Определение таблицы должно быть предоставлено как CREATE TABLE, пример данных как INSERT INTO.
Не используйте REPEAT в SP - неудобно. Используйте оператор LOOP и IF [flag | condition] THEN LEAVE LOOP. Это позволяет вам иметь много точек выхода с различными используемыми условиями выхода (например, обнаруженными разными обработчиками или явными условными операторами). В вашем случае это также позволяет иметь только один оператор FETCH.






Для этого не нужна процедура. Запрос с count() и предложением group by даст вам то, что вы хотите:
SELECT prod_id, count(prod_id) as prod_shipments
FROM shipments
group by prod_id
order by prod_id;
Результат:
| prod_id | prod_shipments |
|---|---|
| 1 | 3 |
| 2 | 2 |
Что мне нужно, так это хранимая процедура и курсоры, потому что я все еще учусь, можете ли вы тогда проверить мою хранимую процедуру?
Мы хотим подсчитать количество строк с каждым идентификатором, поэтому мы используем
INSERT INTO products_Info VALUES(p_id, 1)
> ON DUPLICATE KEY UPDATE
> prod_shipments = prod_shipments + 1;
DELIMITER $$ CREATE PROCEDURE check_shipments() BEGIN DECLARE no_more_products int DEFAULT 0; DECLARE p_id int DEFAULT 0; DECLARE ship_times int DEFAULT 0; DECLARE cur_shipments CURSOR FOR SELECT prod_id FROM shipments; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1; CREATE table IF NOT EXISTS products_Info( prod_id int primary key, prod_shipments int); OPEN cur_shipments; FETCH cur_shipments INTO p_id; REPEAT SELECT count(prod_id) INTO ship_times FROM shipments where prod_id = p_id; IF ship_times > 0 THEN INSERT INTO products_Info VALUES(p_id, 1) ON DUPLICATE KEY UPDATE prod_shipments = prod_shipments + 1; END IF; FETCH cur_shipments INTO p_id; UNTIL no_more_products = 1 END REPEAT; CLOSE cur_shipments; SELECT * FROM products_Info; drop table products_Info; END $$ DELIMITER ;
call check_shipmentsprod_id | prod_shipments ------: | -------------: 1 | 3 2 | 2
дб <> рабочий пример здесь
ОБЪЯВИТЬ cur_shipments КУРСОР ДЛЯ ВЫБЕРИТЕ prod_id ИЗ отправлений;
загружает 5 строк в курсор, вы выполняете цикл 4 раза, но вставляете 5 раз, потому что первая выборка находится вне цикла и поскольку в pid нет первичного/уникального ключа, вставляются 5 строк.
Вы могли
ОБЪЯВИТЬ cur_shipments КУРСОР ДЛЯ ВЫБЕРИТЕ ОТЛИЧНЫЕ prod_id ОТ отгрузок;
поэтому курсор содержит только 2 строки
или
добавить первичный ключ к отгрузке продуктов, удалить оператор select (count)... и изменить вставку на вставку в дублирующем ключе
REPEAT
INSERT INTO products_Info(prod_id ,prod_shipments) VALUES(p_id, 1)
ON DUPLICATE key update prod_shipments = prod_shipments + 1;
FETCH cur_shipments INTO p_id;
UNTIL no_more_products = 1 END REPEAT;
я попробую этот
опубликуйте определения таблиц и образцы данных, а также требуемый вывод КАК ТЕКСТ