DELIMITER //
CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END//
DELIMITER ;
DELIMITER //
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obatin order total,optionally adding tax'
BEGIN
-- Declare variable for total
DECLARE total DECIMAL(8,2);
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
-- Yes,so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;
-- And finally,save to out variable
SELECT total INTO ototal;
END//
DELIMITER ;
以上都是获得订单合计的储存过程,前一个较简单,后一个较复杂。
1,第二个的复杂之处:
不只是简单的获得订单合计,还需要考虑是否要对特定的客户增加营业税的问题。即总计不再是直接获得中间还要经过一个IF条件。
2,中间还涉及了用declare定义局部变量的过程。
有关局部变量的内容可参考文章:https://www.cnblogs.com/pcheng/p/4943096.html
为什么要定义订单总和total此局部变量,因为订单总和不再是直接获得的了,其最终结果还加了判断是否有营业税这一步,所以要创建一个中间变量。
为什么要有税率taxrate此局部变量,是因为提供给存储的是布尔值,而不是税率,但是计算有营业税的订单合计总数total需要明确的,且不变的税率。而且此税率不必要被每个人都看见,为了数据安全。
3,局部变量只能在BEGIN和END中间使用,而且经过i过程时可能会发生变化,所以在最后一步之前代表总计的变量都是局部变量total,但是在最后一步一定要将最终局部变量total的值赋给out后的total才可以。