关于MySQL建立智能储存过程的初步理解

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才可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值