暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL_存储过程

lin在路上 2020-08-13
311

之前介绍的SQL语句都是针对一个或多个表的单条语句。而存储过程则是用于执行针对多张表的多条MySQL语句(执行的语句与次序也可能不固定)。

1 特点

  • 简单

    • 简化复杂的操作。将处理封装到容易使用的单元中,简化复杂的操作

    • 简化变动的管理。如果表、列名或者业务逻辑有变化,只需要更改存储过程,不会影响上层应用的使用。

  • 安全

    • 防止出错。将需要进行的一系列操作封装起来,供所有应用使用。避免由于执行步骤多导致的出错,从而保证数据的一致性。

  • 高性能

    • 提高性能。使用存储过程比使用单独的SQL语句要快

    • 更强更灵活。存储过程能够使用一些只能用在单个请求的MySQL元素和特性

2 操作

2.1 创建存储过程

 CREATE PROCEDURE productpricing ()
 BEGIN
     SELECT
          AVG(prod_price) AS priceaverage
     FROM
          product;
 END;
 #创建执行过程productpricing,括号中用于保存参数
 #BEGIN和END语句用来保存存储过程体,本案例中为查询平均值

2.2 执行存储过程

 CALL productpricing()
 #括号中为参数,若不需要传入参数也要保留括号

2.3 删除存储过程

 DROP PROCEDURE productpricing;
 #删除不需要带参数及括号
 #若存储过程不存在则报错,可使用DROP PROCEDURE IF EXISTS确保只有过程存在时才执行删除操作

2.4 检查存储过程

 SHOW CREATE PROCEDURE productpricing;

2.5 带参数的存储过程(OUT)

 CREATE PROCEDURE productpricing2 (
     OUT Pl DECIMAL (8, 2),
     OUT ph DECIMAL (8, 2),
     OUT pa DECIMAL (8, 2)
 )
 BEGIN
     SELECT
          MIN(prod_price) INTO pl
     FROM
          product;
 
     SELECT
         MAX(prod_price) INTO ph
     FROM
         product;
 
     SELECT
         AVG(prod_price) INTO pa
     FROM
         product;
 END;
 #指定三个参数pl、ph、pa。参数类型为十进制(DECIMAL),支持的参数类型与表中的一致;关键字OUT表示从存储过程传出,此外还支持IN(传递给存储过程)、INOUT(对存储过程传入和传出)
 #通过INTO将查询语句中的值与参数绑定
 
 CALL productpricing2 (
     @pricelow ,@pricehigh ,@priceaverage
 );
 
 SELECT
     @pricelow ,@pricehigh ,@priceaverage
 #执行存储过程时需要指定变量(变量必须以@开头)用于保存返回的值
 #要展示需要使用SELECT语句进行展示

2.6 带参数存储过程(IN)

 CREATE PROCEDURE productpricing3 (
     IN onumber INT,
     OUT ototal DECIMAL (8, 2)
 )
 BEGIN
     SELECT
          SUM(item_price * quantity)
     FROM
          order_item
     WHERE
          order_num = onumber INTO ototal;
 END;
 #创建存储过程
 
 CALL productpricing3 (
     20005 ,@total
 );
 
 SELECT
     @total
 #执行并展示

2.7 智能存储过程

目标,需要进行如下操作

  • 获得合计

  • 把营业税有条件地添加到合计

  • 返回合计(带或不带税)

 delimiter //
 -- name:odertotal 存储过程名:订单总价
 -- parameters: onumber= order number 订单编号
 --                   taxable= 0 if not taxable, 1 if taxable 是否含税
 --                   ototal= order total variable 订单总价变量
 CREATE PROCEDURE ordertotal (
     IN onumber INT,
     IN taxable boolean,
     OUT ototal DECIMAL (8, 2)
 ) COMMENT 'obtain order total,optionally add 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(quantity * item_price)
     FROM
         order_item
     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 our variable
     SELECT
          total INTO ototal ;
 END//
 delimiter ;
 #创建存储过程
 #使用关键字delimiter来切换分隔符,最后需要恢复回去
 #--用来进行注释
 #用来设置局部变量,并能设置默认值(可选)
 
 CALL ordertotal (20005, 0 ,@total);
 
 SELECT
     @total
 #执行并展示




文章转载自lin在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论