MySQL数据库-实验七 存储过程实验

一、实验目的

掌握数据库存储过程的设计和使用方法。

二、实验内容和要求

存储过程的定义,存储过程运行,存储过程更名,存储过程删除。

三、实验步骤

(1) 定义一个存储过程 proc1,更新所有订单(含税折扣价)的总价,执行这个存储过程。
create procedure proc1 ()

begin

    update orders

        set totalprice = (

            select

                sum(

                    extendedprice * (1-discount) * (1+tax)

                    )

            from lineitem

            where orders.orderkey = lineitem.orderkey

            );

end;

call proc1();

(2)定义一个存储过程 proc2,更新给定订单的(含税折扣价)的总价,执行这个存储过
程。
create procedure proc1 ()

begin

    update orders

        set totalprice = (

            select

                sum(

                    extendedprice * (1-discount) * (1+tax)

                    )

            from lineitem

            where orders.orderkey = lineitem.orderkey

            );

end;

call proc1();

(3)定义一个存储过程 proc3,更新某个顾客的所有订单的(含税折扣价)总价,执行
这个存储过程。
create procedure proc3(in cname char(30))

begin

declare tag_custkey int;

select custkey into tag_custkey from customer where name = cname;

update orders  set totalprice = ( select  sum(extendedprice * (1-discount)*(1+tax))from lineitem

        where orders.orderkey = lineitem.orderkey and orders.custkey = tag_custkey);

end;

call proc3 ('白毛');

(4)定义一个存储过程 proc4,更新某个顾客的所有订单的(含税折扣价)总价并输出
该总价,执行这个存储过程。
create procedure proc4(

    in cname char(30),

    out totalprice numeric(10,2)

    )

begin

    declare tag_custkey int;

    select  custkey into tag_custkey from customer where name = cname ;

    update  orders set totalprice = (

        select  sum(extendedprice * (1-discount )*(1+tax))from lineitem where orders.orderkey = lineitem.orderkey and orders.custkey = tag_custkey

        );

    select  sum(totalprice) into totalprice from orders where custkey = tag_custkey group by  custkey;

end;

call proc4('白毛',@test);

SELECT @test ;

(5)删除存储过程 proc4。
drop procedure proc4 ;

(6)定义一个存储过程 proc5,更新某年订单(含税折扣价)的总价,执行这个存储过程。
(要求使用游标完成)。
CREATE PROCEDURE proc5(IN p_year INT)

BEGIN

    DECLARE done INT DEFAULT FALSE;

    declare order_id int;

    declare total_price decimal(10,2) ;

    DECLARE cur_order CURSOR FOR SELECT  orders.orderkey,SUM(extendedprice * (1 - discount) * (1 + tax))

        AS total_price FROM lineitem,orders WHERE lineitem.orderkey= orders.orderkey

            and  YEAR(orderdate) = p_year GROUP BY orderkey;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur_order;

    read_loop: LOOP

        FETCH cur_order INTO order_id, total_price;

        IF done THEN

            LEAVE read_loop;

        END IF;

        UPDATE orders SET totalprice = total_price WHERE orders.orderkey = order_id;

    END LOOP;

    CLOSE cur_order;

END //

call proc5 (2023);
(7)定义一个存储过程 proc6,能够根据某年(年份作为输入参数,整数)各个客户的下

订单购买情况,把该年客户订单总金额超过某个阈值(该阈值为输入参数,为整数)的客户表(customer)中的备注(comment)字段更新为重要客户(“SVIP”)(要求使用游标完成)。

DELIMITER //

CREATE PROCEDURE proc6(IN p_year INT, IN p_threshold INT)

BEGIN

    DECLARE done INT DEFAULT FALSE;

    DECLARE v_customer_id INT;

    DECLARE v_total_amount DECIMAL(10, 2);

    DECLARE cur_customer CURSOR FOR SELECT custkey, SUM(extendedprice * (1 - discount) * (1 + tax)) AS total_amount FROM lineitem,orders WHERE lineitem.orderkey = orders.orderkey and  YEAR(orders.orderdate) = p_year GROUP BY custkey;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;



    OPEN cur_customer;



    read_loop: LOOP

        FETCH cur_customer INTO v_customer_id, v_total_amount;

        IF done THEN

            LEAVE read_loop;

        END IF;



        IF v_total_amount > p_threshold THEN

            UPDATE customer SET comment = 'SVIP' WHERE custkey = v_customer_id;

        END IF;

    END LOOP;

    CLOSE cur_customer;

END //

DELIMITER ;



call proc6(2023,500000);

select  * from customer where comment = 'SVIP';

查找一下设置的信息。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL数据库是一种常用的关系型数据库管理系统。存储过程与函数是MySQL数据库的两个重要特性,通过存储过程和函数,可以实现对数据库的高效操作。下面将详细介绍存储过程与函数的构建与使用。 首先,存储过程是一组经过预编译的SQL语句集合,可以被调用执行。在MySQL中,存储过程的构建可以通过CREATE PROCEDURE语句来完成。存储过程可以带有输入参数、输出参数和返回值。通过参数的使用,可以在存储过程中实现灵活的数据处理。存储过程可以被直接调用,也可以被其他存储过程和函数所调用。 其次,函数是一段可重用的SQL代码块,可以被其他SQL语句直接调用。在MySQL中,函数的构建可以通过CREATE FUNCTION语句来完成。函数可以返回一个值,也可以返回一个表。与存储过程不同的是,函数不能直接进行数据修改操作,而是在查询时返回需要的结果。 存储过程和函数都可以提高数据库的性能和安全性。存储过程可以减少客户端与数据库服务器之间的通信次数,提高执行效率;函数可以封装复杂的查询逻辑,方便其他SQL语句调用,提高代码的重用性。此外,存储过程和函数都可以设置权限控制,确保数据的安全性。 在使用存储过程和函数时,需要注意以下几点:首先,参数的定义和使用需要按照正确的格式和规范进行;其次,在存储过程和函数内部,可以使用多种语句,如SELECT、INSERT、UPDATE和DELETE,以实现不同的数据操作需求;最后,在使用存储过程和函数前,需要确保已经创建了相应的数据库和表结构。 总之,通过存储过程和函数的构建与使用,可以实现对MySQL数据库的高效操作。存储过程和函数提供了一种灵活、可重用的方式来处理数据,提高了数据库的性能和安全性。在实际应用中,可以根据具体的需求,合理地使用存储过程和函数,以提升系统的效率和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值