Хранимая процедура преобразует int в десятичное

0

Я пишу хранимую процедуру, чтобы вернуть некоторую статистику. У меня есть две разные таблицы: одна со статистикой, собранной после того, как система была принята в употребление, другая - с учетом статистики

Моя процедура такова:

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, было бы высоко оценено.

Теги:
stored-procedures
return-value

1 ответ

2
Лучший ответ

Я нашел лучший способ заставить типы в select в хранимых procs - INSERT... SELECT во временную таблицу (созданную в proc с желаемыми типами), а затем выберите ее. Вы можете попробовать CAST(x AS SIGNED), но тогда вы не можете контролировать BIGINT, INT и т.д.

Изменение: CAST обычно отлично работает в хранимой процедуре/запросе; но когда вам нужны более определенные типы для взаимодействия с вызовами API, такие как GetInt32(fieldnum), метод temp table может быть очень полезным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню