我想从一个程序中调用多个程序。在下面的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,则会出现相同的行为 - 第一个过程被调用而不是第二个过程。
答案 0 :(得分:1)
我怀疑它无法正常工作,因为您更新lastaccessed
时间并计算与NOW
的差异。第一项工作因为有显着差异。但是使用第二个存储过程,timestammpdiff
和NOW()
之间会有NOW() - miliseconds
。
检查从更新中删除第一个存储过程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;