Хранимая процедура MySQL: набор переменных равен нулю, хотя запрос возвращает результаты - PullRequest
2 голосов
/ 07 марта 2012

У меня проблемы с хранимыми процедурами, эта часть для меня более конкретна:

   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.

Я запрашиваю поле с тем же именем, что и объявленная переменная в моей хранимой процедуре.

Переменная используется в запросе вместо поля таблицы.

Спасибо мне!

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Edit2: ошибка новичка Okaaaaaay здесь.

Я запрашиваю поле с тем же именем, что и объявленная переменная в моей хранимой процедуре.

Переменная используется в запросе вместо поля таблицы.

Спасибо мне!

(охота за бейджами тут же;))

0 голосов
/ 07 марта 2012

Используйте это для назначения вашей переменной из запроса:

SELECT total_amount_default = CONVERT(`value`+commission,DECIMAL(10,2))
FROM remunerations r 
JOIN groups g 
      on g.idgroup = r.idgroup 
WHERE g.idprogram=idprogramV 
      AND r.idmode=idmodeV 
      AND g.`default`=1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...