【问题标题】:MySQL - Call Multiple Procedures from Within a ProcedureMySQL - 从一个过程中调用多个过程
【发布时间】:2015-10-10 07:58:55
【问题描述】:

我想从一个过程中调用多个过程。在下面的 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,则会发生相同的行为 - 调用第一个过程而不是第二个。

【问题讨论】:

  • 我喜欢你图片中的开头。透明控制台背景 ;)

标签: mysql stored-procedures


【解决方案1】:

我怀疑它没有按预期工作,因为您更新了lastaccessed 时间并计算了与NOW 的差异。第一次工作,因为有显着差异。但是对于第二个存储过程,您在NOW()NOW() - miliseconds 之间有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 中:

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

【讨论】:

  • 小伙子的洞察力真是太棒了——我在第一次通话时更新了我的上次访问时间,所以第二次通话不到一秒,所以我没有看到任何变化。这是我一直为我的同学们解决的那种愚蠢的监督(我自愿担任助教)。我不敢相信我竟然犯了这么明显的错误,就像我一直在为别人修复的错误一样!哈;就在前几天,我不小心(在一个单独的程序中)写了“const int pi = 3.1459;”也许这只是我愚蠢的一周!非常感谢!
  • @MagicalGordon 顺便说一句,我什么时候可以玩这个游戏;)
  • 我在学校@我的学校领导一个俱乐部,我们正在努力在 4 周内推出我们最小可行的产品。当然,它几乎完全依赖于我,因为除了前端 HTML/CSS 之外,我什么都做。我试图在我的数据库中加入大量逻辑以减少 PHP 代码和网络调用等,我只是认为用 SQL 编写程序非常酷。所以是的,可能是 4 周?这里完全未完成的产品:github.com/candyapplecorn/php-mysql-game
  • @MagicalGordon 很高兴听到它。祝你发展顺利,记住 SO 社区会有所帮助 ;)
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2016-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多