Сегодня почти весь день убил на отлавливание непонятного глюка в MySQL.
Суть глюка следующая. Допустим есть процедура которая считает прибыль по всем сделкам одного пользователя и записывает это в другую таблицу, например, в колонку пользователя.
Выглядит она следующим образом:
DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `calcProfit`(userId bigint) begin declare profit double; select sum(`profit`) into profit from `user_orders` where `user_id` = userId; update `users` set `total_profit` = profit where `id` = userId; end
Выполняя отдельно запрос
select sum(`profit`) from `user_orders` where `user_id` = userId;
Получаем, допустим, 456,12.
Но при вызове данной процедуры, она записывает нам 0.
Как говорил выше, времени я потратил много. А ошибка (ошибка ли??) оказалась банальной.
В процедурах нельзя делать select в переменные с именем идентичным имени колонки в таблице.
Если честно, в документации такого ограничения не нашел, или может плохо искал, но методом научного тыка пришел к этому решению.
Для того чтобы заработал наш предыдущий код, необходимо и достаточно всего лишь изменить имя переменной в которую выполняем select.
Рабочий вариант
DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `calcProfit`(userId bigint) begin declare totalProfit double; select sum(`profit`) into totalProfit from `user_orders` where `user_id` = userId; update `users` set `total_profit` = totalProfit where `id` = userId; end