存储过程与函数的创建管理实验

一、验证性实验
1.某超市的食品管理的数据库的Food表,Food表的定义如表所示,
Food表的定义
在这里插入图片描述
各列有如下数据:
‘QQ饼干’,‘QQ饼干厂’,2.5,‘2008’,3,‘北京’
‘MN牛奶’,‘MN牛奶厂’,3.5,‘2009’,1,‘河北’
‘EE果冻’,‘EE果冻厂’,1.5,‘2007’,2,‘北京’
‘FF咖啡’,‘FF咖啡厂’,20,‘2002’,5,‘天津’
‘GG奶糖’,‘GG奶糖’,14,‘2003’,3,‘广东’
(1)在food表上创建名为Pfood_price_count的存储过程。其中存储过程Pfood_price_count有3个参数。输入参数为price_infol和price_info2,输出参数为count。存储过程的满足:查询food表中食品单价高于price_infol且低于price_info2的食品种数,然后由count参数来输出,并且计算满足条件的单价的总和。
代码如下:
//使用“DELIMITER &&”将SQL语句的结束符号变成&&
DELIMITER &&
CREATE PROCEDURE Pfood_price_count (IN price_info1 FLOAT,IN price_info2 FLOAT, OUT count INT )
READS SQL DATA
BEGIN
//定义变量temp
DECLARE temp FLOAT;
//定义游标match_price
DECLARE match_price CURSOR FOR SELECT price FROM food;
//定义条件处理。如果没有遇到关闭游标,旧退出存储过程
DECLARE EXIT HANDLER FOR NOT FOUND CLOSE match_price;
//为临时变量sum赋值
SET @sum=0;
//用SELECT … INTO 语句来为输出变量count赋值
SELECT COUNT(*) INTO count FROM food
WHERE price>price_info1 AND price<price_info2 ;
//打开游标
OPEN match_price;
//执行循环
REPEAT
//使用游标match_price
FETCH match_price INTO temp;
//执行条件语句
IF temp>price_info1 AND temp<price_info2
THEN SET @sum=@sum+temp;
END IF;
//结束循环
UNTIL 0 END REPEAT;
//关闭游标
CLOSE match_price;
END &&
//将SQL语句的结束符号变成“;”
DELIMITER ;
在这里插入图片描述
(2)使用CALL语句来调用存储过程。查询价格在2至18之间的食品种数。代码如下:
CALL Pfood_price_count(2,18,@count) ;
在这里插入图片描述
(3)使用SELECT语句查看结果。代码如下:
SELECT @count,@sum;
在这里插入图片描述
其中,count是存储过程的输出结果:sum是存储过程中的变量,sum中的值满足足条件的单价的总和。
(4)使用DROP语句删除存储过程Pfood_price_count。代码如下:
DROP PROCEDURE Pfood_price_count ;

(5)使用存储函数来实现(1)的要求。存储函数的代码如下:
DELIMITER &&
CREATE FUNCTION Pfood_price_count1(price_info1 FLOAT,price_info2 FLOAT )
RETURNS INT READS SQL DATA
BEGIN
RETURN (SELECT COUNT(*) FROM food
WHERE price>price_info1 AND price<price_info2 );
END &&
DELIMITER ;
在这里插入图片描述
(6)调用存储函数
SELECT Pfood_price_count1(2,18);
在这里插入图片描述
(7)删除存储函数
在这里插入图片描述
注:存储函数只能返回一个值,所以只实现了计算满足条件的食品种数。使用RETURN来将计算的食品种数返回回来。调用存储函数与调用MySQL内部函数的方式是一样的。
二、设计性实验
学校教师管理数据库中的teacherInfo表,其表的定义如下表所示,请完成如下操作。
在这里插入图片描述
向teacherInfo表中插入记录:
1001,‘张龙’,‘男’,‘1984-11-08’,‘北京市昌平区’
1002,‘李梅’,‘女’,‘1970-01-21’,‘北京市海淀区’
1003,‘王一丰’,‘男’,‘1976-10-30’,‘北京市昌平区’
1004,‘赵六’,‘男’,‘1980-06-05’,‘北京市顺义区’
在这里插入图片描述
(1)创建名为teachernfo1的存储过程。要求:存储过程teachernfo1有3个参数。输入参数为teacherid和type,输出参数为info。满足:根据编号(teacherid)来查询teachernfo表中的记录。如果type的值为1时,将姓名(name)传给输出参数info;如果type的值为2时,将年龄传给输出参数info;如果type为其他值,则返回字符串“Error”。
delimiter &&
create procedure teachernfo1(in teacherid int, in type int, out info varchar(20))
reads sql data
begin
case type
when 1 then
select name into info from teacherinfo where num=teacherid;
when 2 then
select year(now())-year(birthday) into info from teacher where num=teacherid;
else select ‘Error’ into info;
end case;
end &&
delimiter;
在这里插入图片描述
(2)调用存储过程,参数值teacher id为2,type为1。
call teachernfo1(2,1,@info);
在这里插入图片描述
(3)使用DROP PRODECURE语句来删除存储过程
drop PROCEDURE teachernfo1;
在这里插入图片描述
(4)创建名为teacherinfo2的存储函数。要求:存储过程teacherinfo2有两个参数:teacher id和type。满足:根据编号(teacher id)来查询teacher表中的记录。如果type的值是1时,则返回姓名(name)值;如果type的值是2时,则返回年龄;如果type为其他值,则返回字符串“Error”。
delimiter &&
create function teacherinfo2(teacherid int,type int)
returns varchar(20) reads sql data
begin
declare temp varchar(20);
if type=1
then
select name into temp from teacherinfo where num=teacherid;
elseif type=2
then
select year(now())-year(birthday) into temp from teacherinfo where num=teacherid;
else
set temp=‘Error’;
end if;
return temp;
end &&
delimiter ;
在这里插入图片描述
(5)使用SELECT语句调用teacherinfo2存储函数。
select teacherinfo2(1002,1);
select teacherinfo2(1003,2);
select teacherinfo2(1004,3);
在这里插入图片描述
(6)使用DROP FUNCTION语句来删除teacherinfo2存储函数。
drop function teacherinfo2;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_55726741/article/details/129248725