likes
comments
collection
share

数据库的存储过程该如何使用?

作者站长头像
站长
· 阅读数 21

使用存储过程

存储过程

存储过程简单来说,就是为了以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。但他的作用不仅限于批处理。

为什么要处理存储过程

  • 通过把处理封装在容易使用的单元中,简化复杂的操作。
  • 使用统一存储过程,可防止错误,因为执行的步骤越多,出错的可能性就越大。
  • 简化对变动的管理。如果变动了,我们只需修改存储过程就好。
  • 提高性能,使用存储过程比单独的SQL语句要快
  • 存在一些只能在单个请求中的MySQL元素和特性,存储过程可以使用他们来编写功能更强更灵活的代码。

总而言之就是:简单,安全,高性能。

使用存储过程

执行存储过程

mysql称存储过程的执行为调用。

CALL productpricing (@pricelow
                    @pricehigh
                    @priceaverage);

执行名为productpricing的存储过程,它计算并返回产品的最低,最高和平均价格。

创建存储过程

例:返回产品平均价格的存储过程

CREATE PROCEDURE productpricing()
BEGIN 
    SELECT Avg(prod_price) AS priceaverage
    FROM products;
END;

这个存储过程叫productpriceing,用CREATE PROCEDURE productpricing()语句定义。

如果,存储过程接受参数,他们将在()中列举出来。此存储过程没有参数,但后面的()依旧需要你跟着。BEGIN和END用来限定存储过程体。

那么如何使用这个存储过程呢?

CALL productpricing();

删除存储过程

DROP  PROCEDURE productpricing;

使用参数

一般来说,存储过程是不显示结果的,而是把结果返回给你指定的变量

变量:内存中一个特定的位置,用来临时存储数据。

那么我们修改一手productpricing():

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
    )
BEGIN 
    SELECT Min(prod_price)
    INTO p1
    FROM products;
    SELECT Max(prod_price)
    INTO ph
    FROM products;
    SELECT AVg(prod_price)
    INTO pa
    FROM products;
END;

🍨 pl存储产品的最低价格。每个参数必须具有指定的类型,这里使用十进制值。关键字out指出这个参数是用来从存储过程传出一个值(返回给调用者)。

IN:传递给存储过程

OUT: 从存储过程传出

INOUT: 对存储过程传入和传出

CALL productpricing (@pricelow
                    @pricehigh
                    @priceaverage);

mysql的变量名必须以@开始

我们想要的结果就存储到了上面的三个变量里面了

SELECT @pricelow;

用上面的语句,就可以看到这个值了。

我们再写一个例子,用用IN和OUT。ordertotal接受订单号并返回该订单的合计

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;

那要怎么样调用呢?

CALL ordertotal (20005,@total);

建立智能存储过程

--NAME:ordertatal
--Parameters:onumber = order number 
--          taxable = 0 if not taxable , 1 if taxable
--          ototal = order total variableCREATE PROCEDURE ordertotal(
        IN onumber INT ,
        IN taxable BOOLEAN,
        OUT ototal DECIMAL (8,2)
        )COMMIT 'Obtain 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 tatal
    SELECT Sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = onumber
    INTO tatal;
    
    --IS this taxble?
    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;
  • -- 这玩意后面跟的是注释
  • DECLARE语句定义了两个局部变量,还支持设定默认值
  • SELECT语句的结果存储到了total
  • IF呢就是IF用法呗,真就执行。

检查存储过程

SHOW PROCEDURE STATUS LIKE '过程名';

会获得何时,谁创建等详细信息的存储过程列表。

转载自:https://juejin.cn/post/7149563348278296583
评论
请登录