如何创建一个存储过程来迭代表并将id传递给另一个存储过程?

问题描述 投票:0回答:1

我有一个巨大的订单表,我需要清除具有某些 city_id 的订单表。我创建了一个存储过程,它接受 1 个参数并一次删除 10,000 条记录,并且运行良好。 city_id 来自使用此查询的表:

mysql> SELECT city_id from cities where state_name in ('NY', 'TX');

问题是我必须为结果集中的每个 city_id 手动运行数十个存储过程,如下所示:

mysql> CALL purge_orders_by_city(12);
mysql> CALL purge_orders_by_city(16);
mysql> CALL purge_orders_by_city(28);
mysql> CALL purge_orders_by_city(39);
etc...

如何创建一个存储过程来迭代城市表,并将 city_id 传递给 purge_orders_by_city() 存储过程?

我已经尝试过常规的“按 id 限制 10000 从 city_id in (1, 2, 3, 4...) order by id limit 10000 的订单中删除”,但每个 10K 批次的执行时间随着执行而变得更长。例如,前几批每批仅花费 15 秒。到第 300,000 个批次时,已经需要 30 秒。使用“where city_id = 1”将批次限制为一个 city_id 会更快,即使我必须一次运行 1 个 city_id。

mysql parameters procedure purge routines
1个回答
0
投票

您必须创建另一个存储过程来运行 purge_orders_by_city 过程的循环。

something like this 
    
-- existing varaibles
DECLARE cur_city_id  CURSOR FOR SELECT city_id from cities where state_name in ('NY', 'TX');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


OPEN cur_city_id ;
    read_loop: LOOP
        FETCH cur_city_id INTO v_city_id;
        IF done THEN
            LEAVE read_loop;
        END IF;

        CALL purge_orders_by_city(v_city_id);

    END LOOP;

    CLOSE cur_city_id 
© www.soinside.com 2019 - 2024. All rights reserved.