MySQL - Call Multiple Procedures from Within a Procedure -
i want call multiple procedures within procedure. in following sql, create 3 procedures. upd_r_money , upd_r_fuel both work expected when called individually command line. when call upd_all, first call within upd_all run; second call upd_r_money doesn't run.
i can't figure out why happens - maybe in upd_r_fuel procedure causes upd_all procedure end early? newby writing procedures, , sql in general.
there question here problem, answer i'm doing, , answer's link down.
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 gamerows id = row_id), now())); update gamerows set money = money + period * money_rate, lastaccessed = now() 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 gamerows id = row_id), now())); update gamerows set fuel = fuel + period * fuel_rate, lastaccessed = now() 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 ;
if copy , paste above sql commands, procedures created no errors , can call 3 of them. wrote earlier, upd_all seems stop after calling first procedure within. if switch upd_r_money upd_r_fuel, same behavior occurs - first procedure called , not second.
i suspect doesn't work expected because update lastaccessed
time , calculate difference now
. first work because there significant difference. second stored procedure have timestammpdiff
between now()
, now() - miliseconds
.
check if removing in first stored procedure lastaccessed
update helps.
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 gamerows id = row_id), now())); update gamerows set money = money + period * money_rate id = row_id; end; // delimiter ;
warning: order of execution matters.
also stored procedures similiar combine them in 1 update:
update gamerows set fuel = fuel + period * fuel_rate, money = money + period * money_rate, lastaccessed = now() id = row_id;
Comments
Post a Comment