04-存储过程

作者: 紫荆秋雪_文 | 来源:发表于2021-09-27 14:35 被阅读0次

一、创建存储过程

1、返回产品平均价格的存储过程

CREATE PROCEDURE productpricing() 
BEGIN
    SELECT
        AVG( prod_price ) AS priceaverage 
    FROM
        products; 
END;
  • 此存储过程名为productpricing,用 CREATE PROCEDURE productpricing() 语句定义
  • 如果存储过程接受参数,它们将在()中列举出来
  • BEGIN 和 END语句用来限定存储过程体,过程体本身仅是一个简单的 SELECT 语句

2、MySQL命令行客户机的分隔符

  • 默认的MySQL语句分隔符为;,如果在存储过程自身内的有;字符,则它们最终不会成为存储过程的成分,这会使存储过程中的SQL出现语法错误
  • 解决办法是临时更改命令行实用程序的语句分隔符,DELIMITER //告诉命令行实用程序实用 // 作为新的语句结束分隔符,可以看到标志存储过程结束的 END定义为 END// 而不是 END;
  • 最后,为恢复为原来的语句分隔符,可使用 DELIMITER ;。
  • 除 \ 符号外,任何字符都可以用作语句分隔符
DELIMITER //
CREATE PROCEDURE productpricing() 
BEGIN
    SELECT
        AVG( prod_price ) AS priceaverage 
    FROM
        products ;
END //
DELIMITER ;

二、使用存储过程

CALL productpricing();

三、删除存储过程

DROP PROCEDURE productpricing;

四、存储过程使用参数

1、变量(variable)

  • 内存中一个特定的位置,用来临时存储数据

2、创建带有参数的存储过程

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8, 2),
    OUT ph DECIMAL(8, 2),
    OUT pa DECIMAL(8, 2)
)
BEGIN
    SELECT MIN(prod_price)
    INTO pl
    FROM products;
    
    SELECT MAX(prod_price)
    INTO ph
    FROM products;
    
    SELECT AVG(prod_price)
    INTO pa
    FROM products;
END;
  • 此存储过程接受 3 个参数
    • pl:存储产品最低价格
    • ph:存储产品最高价格
    • pa:存储产品平均价格

3、调用带有参数的存储过程

CALL productpricing(
@priceLow,
@priceHigh,
@priceAvg
)
  • 调用时,这条语句并不显示任何数据。为了显示检索出的产品的3个值,可进行如下操作
SELECT @priceLow, @priceHigh, @priceAvg

五、使用 IN 和 OUT 参数的存储过程

1、创建同时带有 IN 和 OUT 参数的存储过程

CREATE PROCEDURE orderTotal(
    IN number INT,
    OUT total DECIMAL(8, 2)
)
BEGIN
    SELECT SUM(item_price * quantity)
    FROM orderitems
    WHERE order_num = number
    INTO total;
END;
  • number定义为 IN,因为订单号被传入存储过程
  • total 定义为 OUT,因为要从存储过程返回合计
  • WHERE子句使用number选择正确的行
  • INTO 使用 total 存储计算出来的合计

2、调用同时带有 IN 和 OUT 参数的存储过程

CALL orderTotal(20005, @total)

3、显示同时带有 IN 和 OUT 参数的存储过程

SELECT @total

六、建立智能存储过程

  • 在存储过程内包含业务规则和智能处理时,才能显示出存储过程的威力

1、获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(条件),那么需要做下面几件事情

  • 获得合计(与以前一样)
  • 把营业税有条件地添加到合计
  • 返回合计(带或不带税)

2、创建存储过程

CREATE PROCEDURE orderTotalAuto(
    IN number INT,
    IN taxable BOOLEAN,
    OUT ototal DECIMAL(8, 2)
)
BEGIN
    -- 申明变量 
    DECLARE total DECIMAL(8, 2);
    -- 申明 税率 6%
    DECLARE taxrate INT DEFAULT 6;
    
    -- 获取订单 总数
    SELECT SUM(item_price * quantity)
    FROM orderitems
    WHERE order_num = number
    INTO total;
    
    -- 判断是否需要税率 
    IF taxable THEN
        SELECT total + (total / 100 *taxrate) INTO total;
    END IF;
    
    SELECT total INTO ototal;
END;

3、调用没有添加税率

CALL orderTotalAuto(20005, 0, @total)
SELECT @total

4、调用添加税率

CALL orderTotalAuto(20005, 1, @total)
SELECT @total

相关文章

  • 04-存储过程

    一、创建存储过程 1、返回产品平均价格的存储过程 此存储过程名为productpricing,用 CREATE P...

  • 04-数据存储

    1.如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 编写SQL语句来操作原来表中的字段 1...

  • 04-存储原理

    一、思考问题 1、容器是什么? 为什么容器可以不依赖其他环境而独立提供服务,比如:Nginx、MySQL,好像容器...

  • Mysql存储过程

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的“脚本” 创建存储过程 调用存储过程 存储过程...

  • MySQL批量添加数据

    创建存储过程 执行存储过程 删除存储过程

  • 17 存储过程

    过程: 函数: 过程是没有返回值的函数 存储过程: 存储过程语法 存储过程1--创建简单的存储过程 存储过程2--...

  • 存储过程

    详见存储过程详解 创建存储过程 使用存储过程 存储过程简介 什么是存储过程:存储过程可以说是一个记录集吧,它是由一...

  • 存储过程与函数

    存储过程与函数存储过程的定义存储过程的创建存储过程的操作自定义函数 存储过程与函数 存储过程的定义 运行效率高 降...

  • 存储过程

    ps 不能修改过程体,要修改过程体必须先删除存储过程,再重建 mysql变量的术语分类: 1.用户变量:以"@"开...

  • 存储过程

    存储过程 过程,可以简单理解为是一个函数。 函数和过程的区别:函数总是向调用者返回数据,而过程没有数据返回。 Or...

网友评论

    本文标题:04-存储过程

    本文链接:https://www.haomeiwen.com/subject/mwyhnltx.html