如何实现调用 check_shipments; 的结果?

How do I achieve the outcome of call check_shipments;

你好我想实现调用的结果check_shipments;

Table 定义:

如何使用以下代码实现上述带游标的存储过程: 请告诉我我应该在代码中更改什么

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 ;

但是我的存储过程的结果是这样的:

非常感谢您的帮助,因为我对学习数据库的东西还很陌生。

你不需要这个程序。带有 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

我们想计算每个id的行数,所以我们使用

 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_shipments
prod_id | prod_shipments
------: | -------------:
      1 |              3
      2 |              2

db<>fiddle here

声明 cur_shipments 游标 SELECT prod_id 来自发货;

将 5 行加载到游标,循环 4 次,但插入 5 次,因为第一次提取是在循环外并且因为 pid 上没有 primary/unique 键,所以插入了 5 行..

你可以

声明 cur_shipments 游标 SELECT DISTINCT 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;