У меня проблемы с хранимыми процедурами, эта часть для меня более конкретна:
CREATE FUNCTION calculCommission
(
idprogramV INT
, idmodeV INT
, amount DECIMAL(10,2)
, amount_total DECIMAL(10,2)
,idformat INT
)
RETURNS DECIMAL(10,2)
BEGIN
DECLARE commission DECIMAL(10,2);
DECLARE total_amount_default DECIMAL(10,2);
IF amount_total IS NULL OR amount_total = '' THEN
SET total_amount_default = (SELECT CONVERT(`value`+commission,DECIMAL(10,2)) as default_amount
FROM remunerations r
JOIN groups g
on g.idgroup = r.idgroup
WHERE g.idprogram=idprogramV
AND r.idmode=idmodeV
AND g.`default`=1);
SET commission = (total_amount_default - amount);
ELSE
SET commission = amount_total - amount;
END IF;
RETURN commission;
END$$
Во-первых, я понял, что передача значения NULL для "amount_total" не будет правильно проанализирована процедурой.
ЕСЛИ amount_total IS NULL вернет false, если для параметра amount_total установлено значение NULL, НО это считается пустой строкой. Странно, но я обошел это, используя "ИЛИ amount_total = ''.
Теперь моя проблема в том, что строка SET total_amount_default.
Когда я вручную выполняю запрос, который должен быть извлечен в переменную в клиенте SQL, я получаю результат (0,56). Но в хранимой процедуре она всегда возвращает NULL.
Мне интересно, имеет ли это какое-то отношение к типам данных, поэтому я попытался преобразовать результат или переменные, которые передаются в запрос. Но у меня есть другие процедуры, которые дают правильный результат с точно таким же типом выражения.
Я тут же почесал голову и понятия не имею, как решить эту проблему.
Спасибо за вашу помощь
Редактировать: я добавил отладку, чтобы посмотреть, что происходит:
Значение idprogramV, непосредственно перед попыткой запроса: 4258
Значение idmodeV, в то же время: 1
использование запроса с этими параметрами возвращает 0,52, но я попытался вставить результат непосредственно в таблицу, чтобы увидеть, как он выглядит, и я получаю NULL ...
На самом деле я понятия не имею, что не так, я предполагаю, что это замена переменной для выполнения запроса.
Edit2: здесь новенькая ошибка Okaaaaaay.
Я запрашиваю поле с тем же именем, что и объявленная переменная в моей хранимой процедуре.
Переменная используется в запросе вместо поля таблицы.
Спасибо мне!