问题描述
您能帮忙吗?
此代码应将包装中的产品数量更新为等于构成包装的最小产品库存。我的库存每5分钟根据Oracle ERP数据更新一次,但是ERP不知道中止包装-它们仅存在于Prestashop中,并且必须按周期独立地更新(作业)。我尝试按程序进行。
CREATE OR REPLACE PROCEDURE B2C_P_QUANTYTY_UPDATE
BEGIN
FOR i IN
(SELECT ps_pack.id_product_pack,min(ps_stock_available.quantity) min_quantity
FROM ps_pack,ps_stock_available
WHERE ps_pack.id_product_item = ps_stock_available.id_product
GROUP BY ps_pack.id_product_pack)
LOOP
UPDATE ps_stock_available
SET ps_stock_available.quantity = i.min_quantity
WHERE ps_stock_available.id_product = i.id_product_pack ;
END LOOP ;
END;
在分析中发现2个错误。
Unrecognized data type. (near "ps_pack" at position 81)
Unrecognized data type. (near "(" at position 109)
MySQL返回:
#1064 - Something is wrong in your syntax near 'BEGIN
FOR i IN
(SELECT ps_pack.id_product_pack,min(ps_stock_available.qua' in line 2
我不明白为什么,选择查询可以正常工作。但是包裹在过程中的程序将停止识别数据类型。
解决方法
感谢@Barranka的回复,我发布了SQL - Looping through ever row of table in mysql?。
代码如下:
DELIMITER $$
CREATE OR REPLACE PROCEDURE B2C_P_QUANTYTY_UPDATE ()
BEGIN
DECLARE c_product int;
DECLARE c_min_quantity int;
DECLARE done int default false;
DECLARE quantity_cursor cursor FOR SELECT ps_pack.id_product_pack AS product,MIN(ps_stock_available.quantity) min_quantity
FROM ps_pack,ps_stock_available
WHERE ps_pack.id_product_item = ps_stock_available.id_product
GROUP BY ps_pack.id_product_pack;
DECLARE continue handler FOR not found
SET done = true;
OPEN quantity_cursor;
quantity_loop: LOOP
FETCH quantity_cursor INTO c_product,c_min_quantity;
IF done THEN
leave quantity_loop;
END IF;
UPDATE ps_stock_available
SET ps_stock_available.quantity = c_min_quantity
WHERE ps_stock_available.id_product = c_product;
END loop ;
CLOSE quantity_cursor;
COMMIT;
END$$
DELIMITER ;