gpt4 book ai didi

MySQL - 从一个过程中调用多个过程

转载 作者:可可西里 更新时间:2023-11-01 08:41:42 27 4
gpt4 key购买 nike

我想从一个过程中调用多个过程。在下面的 SQL 中,我创建了三个过程。从命令行单独调用时,upd_r_money 和 upd_r_fuel 都按预期工作。当我调用 upd_all 时,只运行 upd_all 中的第一个调用;第二次调用 upd_r_money 没有运行。

我不明白为什么会这样——也许我的 upd_r_fuel 程序中的某些东西导致我的 upd_all 程序提前结束?我是编写过程和一般 SQL 的新手。

这里有另一个关于这个问题的问题,但答案正是我已经在做的,答案的链接已关闭。

drop procedure upd_r_money;
delimiter //
CREATE procedure upd_r_money(row_id int)
BEGIN
DECLARE money_rate INT DEFAULT 1;
DECLARE period INT DEFAULT 0;
SET period = (select timestampdiff(second, (select lastaccessed from gamerows where id = row_id), now()));
update gamerows
set money = money + period * money_rate,
lastaccessed = now()
where id = row_id;
END;
//
delimiter ;

drop procedure upd_r_fuel;
delimiter //
CREATE procedure upd_r_fuel(row_id int)
fuel: BEGIN
DECLARE fuel_rate INT DEFAULT 1;
DECLARE period INT DEFAULT 0;
SET period = (select timestampdiff(second, (select lastaccessed from gamerows where id = row_id), now()));
update gamerows
set fuel = fuel + period * fuel_rate,
lastaccessed = now()
where id = row_id;
END fuel;
//
delimiter ;

drop procedure upd_all;
delimiter //
CREATE PROCEDURE upd_all(row_id int)
BEGIN
call upd_r_fuel(row_id);
call upd_r_money(row_id);
END;
//
delimiter ;

如果我复制并粘贴上面的 SQL 命令,我的过程创建成功,没有错误,我可以调用所有三个。然而,正如我之前所写,upd_all 似乎在调用其第一个过程后停止。如果我用 upd_r_fuel 切换 upd_r_money,会发生相同的行为 - 第一个过程被调用而不是第二个。

enter image description here

最佳答案

我怀疑它没有按预期工作,因为您更新了 lastaccessed 时间并计算了与 NOW 的差异。首先工作,因为存在显着差异。但是对于第二个存储过程,您在 NOW()NOW() - 毫秒 之间有 timestammpdiff

检查从更新中删除第一个存储过程 lastaccessed 是否有帮助。

drop procedure upd_r_money;
delimiter //
CREATE procedure upd_r_money(row_id int)
BEGIN
DECLARE money_rate INT DEFAULT 1;
DECLARE period INT DEFAULT 0;
SET period = (select timestampdiff(second, (select lastaccessed from gamerows where id = row_id), now()));
update gamerows
set money = money + period * money_rate
where id = row_id;
END;
//
delimiter ;

警告:现在执行顺序很重要。

此外,您的存储过程非常相似,我会将它们合并为一个更新:

update gamerows
set fuel = fuel + period * fuel_rate,
money = money + period * money_rate,
lastaccessed = now()
where id = row_id;

关于MySQL - 从一个过程中调用多个过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com