如何在sproc中循环结果?

Cup*_*ups 2 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
Run Code Online (Sandbox Code Playgroud)

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

我得到了这个sproc,它将获得单一品种的水果的价值.

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我如何从我所在的地方获得:

CALL getStockValue('Comice',1,@tot); 
// gives 36
Run Code Online (Sandbox Code Playgroud)

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

到我想去的地方:

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

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

SELECT SUM(price*quantity) as tot 
FROM fruit 
WHERE name = 'Pear' 
GROUP BY name;
Run Code Online (Sandbox Code Playgroud)

swa*_*eck 5

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

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

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

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
Run Code Online (Sandbox Code Playgroud)