Я пишу хранимую процедуру, чтобы вернуть некоторую статистику. У меня есть две разные таблицы: одна со статистикой, собранной после того, как система была принята в употребление, другая - с учетом статистики
Моя процедура такова:
CREATE PROCEDURE getStats(IN uID INT, IN since_date DateTime)
BEGIN
DECLARE rowcount int;
select klubid from core_medlemmer where id = uID into @klubid;
select create_date from core_klub where id = @klubid into @create_date;
if since_date < @create_date then
-- select from historic and current
select sum(attendance) from core_historic_modestatistik where medlemsid = uID into @historic_total;
SELECT @historic_total + count(*) as total_attendance from core_fremmode where medlemsid= uID and dato >= since_date;
else
-- select only current
SELECT count(*) as total_attendance from core_fremmode where medlemsid= uID and dato >= since_date;
end if;
END //
DELIMITER ;
Выполнение этой хранимой процедуры с select sum(attendance) from core_historic_modestatistik where medlemsid = uID
выглядит правильно:
+-----------------+
| sum(attendance) |
+-----------------+
| 655 |
+-----------------+
Но похоже, что добавление преобразует его в реальное:
+------------------------------------+
| total_attendance |
+------------------------------------+
| 656.000000000000000000000000000000 |
+------------------------------------+
Столбец, который я суммирую, является функцией int, а функция count()
должна только возвращать INT
, поэтому любые советы о том, почему это происходит, и как обращаться с itbest, было бы высоко оценено.
Я нашел лучший способ заставить типы в select в хранимых procs - INSERT... SELECT во временную таблицу (созданную в proc с желаемыми типами), а затем выберите ее. Вы можете попробовать CAST(x AS SIGNED)
, но тогда вы не можете контролировать BIGINT, INT и т.д.
Изменение: CAST обычно отлично работает в хранимой процедуре/запросе; но когда вам нужны более определенные типы для взаимодействия с вызовами API, такие как GetInt32(fieldnum)
, метод temp table может быть очень полезным.