MySQL存储过程:尽管查询返回结果,但变量集为空

时间:2012-03-07 14:53:35

标签: mysql stored-procedures

我遇到了存储过程的问题,这部分对我来说更具体:

   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$$

首先,我意识到过程无法正确解析为“amount_total”传递NULL值。 如果amount_total参数设置为NULL,则IF amount_total IS NULL将返回false,但它被视为空字符串。很奇怪,但我使用“OR amount_total =''来解决这个问题。

现在我的问题是SET total_amount_default行。 当我手动执行应该被提取到SQL客户端中的变量的查询时,我得到一个结果(0.56)。但是在存储过程中,它总是返回NULL。

我想知道这是否与数据类型有关,所以我试图转换结果,或者传递给查询的变量。但我有其他程序可以使用完全相同的表达式给出正确的结果。

我正在那里挠头,并且不知道如何解决这个问题。

感谢您的帮助

编辑:我添加了一些调试,看看发生了什么: idprogramV值,就在尝试查询之前是:4258 idmodeV值,同时为:1 使用带有这些参数的查询返回0.52,但我尝试将结果直接插入表中以查看它的样子,并且我得到NULL ... 我真的不知道什么是错的,我猜它是替换查询执行的变量。

Edit2:Okaaaaaay新手在这里犯了错误。

我正在请求一个与我的存储过程中声明的变量同名的字段。

该变量用于查询而不是表字段。

谢谢我!

2 个答案:

答案 0 :(得分:1)

Edit2:Okaaaaaay新手在这里犯了错误。

我正在请求一个与我的存储过程中声明的变量同名的字段。

该变量用于查询而不是表字段。

谢谢我!

(在那里寻找徽章;))

答案 1 :(得分:0)

使用此选项从查询中分配变量:

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);