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

时间:2015-10-10 07:58:56

标签: mysql stored-procedures

我想从一个程序中调用多个程序。在下面的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

1 个答案:

答案 0 :(得分:1)

我怀疑它无法正常工作,因为您更新lastaccessed时间并计算与NOW的差异。第一项工作因为有显着差异。但是使用第二个存储过程,timestammpdiffNOW()之间会有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;