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

你可能感兴趣的:(MySQL必知必会)