如何在sproc中循环结果?

时间:2013-04-23 17:17:18

标签: mysql stored-procedures

我正在学习mysql(5.5)中的存储过程,并且在这里遇到了一些关于使用sprocs可以做什么的精神障碍。

基础数据如下所示:

select * from fruit;

name | variety | price | quantity
---------------------------------
Pear Comice - 15 -  2
Pear Barlett - 20  - 3
Pear Anjou  - 20 - 3
Apple Red - 10 - 7 
etc

如何获得所有类型水果的综合货币价值,比如所有梨类型?

我得到了这种能够获得单一品种水果价值的香料。

DROP PROCEDURE IF EXISTS getStockValue;

DELIMITER // CREATE PROCEDURE `getStockValue`(
IN variety varchar(20),
IN vat BOOLEAN,
OUT tot DECIMAL(8,2)
)

BEGIN
DECLARE nett_value INT;
SELECT (quantity*price) INTO nett_value from fruit where variety = variety;

IF vat = 1 THEN
SELECT (nett_value*20/100)+(nett_value) INTO tot;
ELSE
SELECT nett_value INTO tot;
END IF;
SELECT tot;

END;// DELIMITER ;

CALL getStockValue('Comice',1,@tot);

因此,从我的基础数据中您可以看到,如果没有增值税,它应该返回总计150,并且增值税为180.

我是否有另一个以某种方式循环通过结果集的sproc? 解决此问题的最佳方法是什么,以便此计算保留在数据库服务器上? 这是否会使用游标?

我已经阅读了很多关于何时/不使用sprocs的内容,但我接受了一家公司的采访,警告我他们已经严重依赖它们了。

编辑 - 为了澄清我的整体问题。

我如何从我所在的位置获得:

CALL getStockValue('Comice',1,@tot); 
// gives 36

(事后应该重命名为getStockValueByVariety())

到我想去的地方:

CALL getStockValueByName('Pear',1,@tot); 
// gives 180 - because it gets ALL Pear types, not just the variety Comice

最终 - 我已经错过了一个GROUP BY ......

SELECT SUM(price*quantity) as tot 
FROM fruit 
WHERE name = 'Pear' 
GROUP BY name;

1 个答案:

答案 0 :(得分:5)

使用CASE语句,只返回存储过程中的值。

SELECT 
    CASE vat
        WHEN 1 THEN (((quantity*price)*20/100) + (quantity * price)) 
        ELSE (quantity*price)
    END AS nett_value
FROM fruit;

如果你想要所有特定品种的总和,那么SUM it

SELECT 
    SUM(CASE vat
        WHEN 1 THEN (((quantity*price)*20/100) + (quantity * price)) 
        ELSE (quantity*price)
    END) AS tot
FROM fruit
WHERE variety = @variety 
GROUP BY
    name