数据库之存储过程与游标的使用

1.某超市的食品管理的数据库的Food表的定义已知。

create database food;
use food;
CREATE TABLE  Foodload (
foodid INT(4) NOT NULL  UNIQUE   PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(20)NOT NULL,
Company VARCHAR(30) NOT NULL,
Price FLOAT NOT NULL,
Product_time YEAR,
Validity_time INT(4),
address VARCHAR(50));



INSERT INTO Foodload VALUES(foodid,'QQ饼干','QQ饼干厂',2.5,'2008',3,'北京');
INSERT INTO Foodload VALUES(2,'MN牛奶','MN牛奶厂',3.5,'2009',1,'河北');
INSERT INTO Foodload(foodid,Name,Company,Price,Product_time,Validity_time,address) 
VALUES
(3,'EE果冻','EE果冻厂',1.5,'2007',2,'北京'),
(4,'FF咖啡','FF咖啡厂',20,'2002',5,'天津'),
(5,'GG奶糖','GG奶糖厂',14,'2003',3,'广东');

a.在food表上创建Pfood_price_count的存储过程。其中,存储过程Pfood_price_count有三个参数。输入参数为price_info1和price_info2,输出参数为count。存储过程满足:查询food表中食品单价高于price_info1且低于price_info2的食品种类,然后由count参数来输出,并且计算满足条件的单价的总和。

delimiter &&
create procedure Pfood_price_count(IN price_info1 FLOAT,IN price_info2 FLOAT,OUT count INT)
reads SQL data
begin
declare temp FLOAT;
declare match_price CURSOR FOR select price from Foodload;
declare exit handler for not found close match_price;
set @sum=0;
select count(*) into count from Foodload
where price>price_info1 and price<price_info2;
open match_price;
repeat
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 &&

b.使用CALL语句调用过程。查询价格在2-18之间的食品种类。

call Pfood_price_count(2,18,@count);

c.使用SELECT语句查看结果。

select @count,@sum;

d.使用DROP语句删除存储过程Pfood_price_count。

drop procedure Pfood_price_count;

e.使用存储函数来实现a的要求。

delimiter &&
create procedure Pfood_price_count(price_info1 FLOAT,IN price_info2 FLOAT)
RETURNS INT READS SQL DATA
BEGIN
RETURN  (SELECT COUNT(*) FROM food
where price>price_info1 AND price<price_info2);
end &&
delimiter;

f.调用函数。


select Pfood_price_count(2,18);

g.删除存储函数。

drop function Pfood_price_count;

2.学校教师管理数据库中的teacherInfo表的定义如表。

create database teacher;
use teacher;
CREATE TABLE  teacherInfo(
id INT(4)  primary key not null unique auto_increment,
num int(10) not null unique,
name VARCHAR(20) NOT NULL,
sex VARCHAR(4) NOT NULL,
birthday datetime,
address VARCHAR(50));



INSERT INTO teacherInfo(id,num,name,sex,birthday,address) 
VALUES
(1,1001,'张龙','男','1984-11-08','北京市昌平区'),
(2,1002,'李梅','女','1977-01-21','北京市海淀区'),
(3,1003,'王一丰','男','1976-10-30','北京市昌平区'),
(4,1004,'赵六','男','1980-06-05','北京市顺义区');

a.创建名为teachernfo1的存储过程。要求:存储过程teachernfo1有3个参数。输入参数为teacher id和type,输出参数为info。满足:根据编号(teacher id)来修饰teachernfo表中的记录。如果type的值为1时,将姓名(name)将传输参数info;如果type的值为2时,将年龄传给输出参数info;如果type为其他值,则返回字符串“Error”。

INSERT INTO teacherInfo(id,num,name,sex,birthday,address) 
VALUES
(1,1001,'张龙','男','1984-11-08','北京市昌平区'),
(2,1002,'李梅','女','1977-01-21','北京市海淀区'),
(3,1003,'王一丰','男','1976-10-30','北京市昌平区'),
(4,1004,'赵六','男','1980-06-05','北京市顺义区');


delimiter &&
create procedure teacher_info(in teacher_id int,in type int,out info varchar(20))
begin
case type
when 1 then 
select name into info from teacherInfo where id = teacherid;
when 2 then 
select year(now())-year(birthday) into info from teacherInfo where id = teacherid;
else
select 'error' into info;
end case;
end &&
delimiter ;

b.调用存储过程,参数值teacher id 为2,type为1。

call teacherInfo(2,1,@info);

c.使用DROP PRODECURE语句来删除存储过程。

drop prodecure teacherinfo1;

d. 创建名为teachernfo2的存储过程。要求:存储过程teachernfo2有2个参数。输入参数为teacher id和type。满足:根据编号(teacher id)来查询teacher表中的记录。如果type的值为1时,则返回姓名(name);如果type的值为2时,则返回年龄;如果type为其他值,则返回字符串“Error”。

delimter &&
create procedure teacherinfo2(in teacher id int,in type int)
reads SQL data
begin
case type
when 1 then
select name into info from teacherInfo where id = teacher id;
when 2 then
select year(now())-year(birthday) into info from teacherInfo where id=theacher id;
else
select 'error' into info;
end &&
delimiter;

e.使用SELECT语句调用teacherinfo2存储函数。

select teacherinfo2 from teacherInfo;

f.使用DROP FUNCTION语句删除teacherinfo2存储函数。


drop function teacherinfo2;

总体的这个,我分条写在这里了,或许是因为我是MySQL 5.5版本,没有使用最新版的缘故,整体上是没有完全验证成功的,存储过程中的调用和查询结果就没有成功,习惯性报错。如果有彻底成功的,请分享、交流,谢谢。

发布了43 篇原创文章 · 获赞 61 · 访问量 5121

猜你喜欢

转载自blog.csdn.net/qq_44735533/article/details/103436111
今日推荐