【问题标题】:MySQL stored procedure with no parameters can't recognize datatypes没有参数的MySQL存储过程无法识别数据类型
【发布时间】:2020-08-22 17:23:12
【问题描述】:

你能帮忙吗?

此代码应将包装中的产品数量更新为等于形成包装的产品的最低库存量。我的库存每 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

我不明白为什么,选择查询工作正常。但是包裹在过程中会停止识别数据类型。

【问题讨论】:

    标签: mysql types prestashop procedure


    【解决方案1】:

    感谢@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 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多