MySQL过程式数据库对象-实验

本文详细介绍了如何使用SQL语句创建、修改、调用存储过程、存储函数、触发器和事件,以及使用游标操作数据。包括比较订单总价、循环遍历游标、计算用户购买总金额、判断商品价格差异等实战练习。
摘要由CSDN通过智能技术生成

一、实验目的

1、掌握创建、修改、删除和调用存储过程、存储函数、触发器和事件的方法。

2、掌握游标的使用方法。

二、实验内容

(一):2学时

使用SQL语句完成下列题目:

1、创建存储过程P_compare,比较两个订单的订单总价,如前者比后者高就输出0,否则输出1.调用该存储过程比较20130411和20130414两个订单的订单总价,输出结果。(2分)

2、创建存储过程,利用循环语句控制fetch语句来检索并显示游标pro_cursor中可用的数据,其中游标pro_cursor指向的是从商品表中查询商品编号和商品名的记录集。(2分)

3、创建存储函数F_totalprice,返回给定用户,给定年份的总购买金额。调用存储函数,返回用户u0003,2013年的总购买金额。(2分)

4、创建一个存储函数F_bj,比较某商品的市场价和成本价,如果相同则返回YES,若不是则返回NO。调用该存储函数分别比较“燕雀”、“狮子犬”和“响尾蛇”的价格,输出结果。(2分)

5、查看名称为p_compare的存储过程。(1分)

6、删除名称为p_compare的存储过程。(1分)

(二):2学时

使用SQL语句完成下列题目:

1、创建触发器ord_upd,实现当向lineitem表插入一行数据时,根据订单号对orders表的订单总价进行修改,订单总价加上该商品明细的金额。(2分)

2、创建一个触发器,当修改product表中商品的市场价格(listprice)时,则触发器将修改lineitem表中对应商品的成交价格unitprice,令其成交价格与商品的市场价格一致。(2分)

3、创建触发器usr_del,在account表中当删除客户信息时将orders表中与该客户有关的数据同时全部删除。(2分)

4、创建触发器ord_del,在orders表中当删除订单信息时将lineitem表中与该订单有关的数据同时全部删除。(2分)

5、查看petstore数据库中的全部触发器。(1分)

6、删除ord_del触发器。(1分)

(三):2学时

使用SQL语句完成下列题目:

1、首先创建一个和orders表结构完全相同的订单历史表oldorders,再创建一个和lineitem表结构完全相同的订单明细历史表oldlineitem,然后创建事件e_orders,从现在开始执行,每隔一年执行一次,实现将orders表中订单日期超过一年的订单记录插入到oldorders表中,将lineitem表中订单日期超过一年的订单记录插入到oldlineitem表中。(4分)

2、创建事件dellorder,从现在开始执行,每隔一年执行一次,将订单时间超过1年的订单信息和订单明细信息删除。(3分)

3、查看事件e_orders的创建信息(1分)

4、临时关闭e_orders事件;(1分)

5、删除事件e_orders。(1分)

实验代码及注释

(一)
1.
delimiter //
create procedure P_compare(in m int(11),in n int(11),out k integer)
begin declare totalprice1,totalprice2 decimal(10,2);
select totalprice into totalprice1 from orders where orderid=m;
select totalprice into totalprice2 from orders where orderid=n;
if totalprice1>totalprice2
then set k=0;
else
 set k=1;
end if;
end //
delimiter ;
call P_compare('20130411','20130414',@k);
select @k;
2.
delimiter //
create procedure pro_cursor()
begin
declare productids char(10);
declare names varchar(30);
declare cursor_text CURSOR FOR select productid,name from product;
declare continue handler for not found set @cur=0;
set @cur=1;
open cursor_text;
fetch cursor_text into productids,names;
while @cur do
select productids,names;
fetch cursor_text into productids,names;
end while;
close cursor_text;
end //
delimiter ;
call pro_cursor();
3.
delimiter //
create function F_totalprice(cid char(6),cdate char(10))
returns decimal(10,2)
DETERMINISTIC
begin 
return (select  sum(totalprice)   from orders  where userid=cid and orderdate like cdate) ;
end //
delimiter ;
select F_totalprice('u0003','2013%');
4.
delimiter //
create function F_bj(n varchar(30))
returns char(6)
DETERMINISTIC
begin
declare a char(6);
declare clistprice decimal(10,2);
declare cunitcost decimal(10,2);
select listprice into clistprice from product where name=n;
select unitcost into cunitcost from product where name=n;
if clistprice=cunitcost  then
set a='YES';
else
set a='NO';
end if;
return a;
end //
delimiter ;
select F_bj('燕雀'),F_bj('狮子犬'),F_bj('响尾蛇');

5.show create procedure P_compare;
6.drop procedure P_compare;
(二)
1、
select * from orders where orderid=20130411;
insert into lineitem values(20130411,'K9-DB-01',2,120);

create trigger ord_upd before insert on lineitem   for each row
update orders set totalprice=totalprice+new.quantity*new.unitprice;

select * from orders where orderid=20130411;
2、
select * from lineitem where productid='K9-DL-01';

create trigger line_upd after update on product  for each row
update lineitem set unitprice =new.listprice where productid=old.productid;

update product set listprice=250 where productid='K9-DL-01';
select * from lineitem where productid='K9-DL-01';
3、
select * from orders where userid='u0002';

create trigger usr_del after delete on account for each row
delete  from orders where userid=old.userid;

delete from account where userid='u0002';
select * from orders where userid='u0002';
4、
select * from lineitem where orderid=20130413;

create trigger ord_del after delete on orders for each row
delete from lineitem where orderid=old.orderid;	


delete from orders where orderid=20130413;
select * from lineitem where orderid=20130413;
5、select * from information_schema.triggers where trigger_schema='petstore'\G
6、select *  from information_schema.triggers  where trigger_name='ord_del';
drop trigger ord_del;

(三)
1.
create table oldorders like orders;
create table oldlineitem like lineitem;
set @@global.event_scheduler = true;
delimiter //
create  event e_orders 
on schedule every 1 year 
do
begin
insert into oldorders 
select * from orders where (datediff(now(),orderdate)/365)>1 ;
insert into oldlineitem
select lineitem.* from lineitem,orders where (datediff(now(),orderdate)/365)>1 and lineitem.orderid=orders.orderid;
end //
delimiter ;
2.
set @@global.event_scheduler = true;
delimiter //
create  event dellorder 
on schedule every 1 year 
do
begin
delete  orders,lineitem
 from  orders,lineitem
where lineitem.orderid=orders.orderid and (datediff(now(),orders.orderdate)/365)>1;
end //
delimiter ;
3.show create event e_orders\G
4.alter event  e_orders disable;
5.drop event  e_orders;

运行结果截图

(一)

6.

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moon-Joe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值