我正在学习 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
我如何获得所有类型水果的综合货币价值,比如所有梨类型?
我已经制作了这个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);
所以从我的基础数据中你可以看到,如果没有增值税,它应该返回总 150,而增值税 180。
我是否有另一个以某种方式循环结果集的存储过程?解决此问题的最佳方法是什么,以便此计算保留在数据库服务器上?这是使用游标的地方吗?
我已经阅读了很多关于何时使用/不使用存储过程的文章,但我接受了一家公司的采访,该公司警告我他们已经严重依赖它们。
编辑- 为了澄清我的整体问题。
我如何从我所在的地方得到:
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
最后 - twigged,我错过了一个 GROUP BY ...
SELECT SUM(price*quantity) as tot
FROM fruit
WHERE name = 'Pear'
GROUP BY name;