第7次作业-存储过程和存储函数

发布时间 2023-11-02 22:03:04作者: Xiiin
这个作业属于哪个课程 https://edu.cnblogs.com/campus/uzz/cs3
这个作业要求在哪里 https://edu.cnblogs.com/campus/uzz/cs3/homework/13095
这个作业的目标 第7次作业-存储过程和存储函数

1.输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名的学生的各科成绩。
DELIMITER @@
CREATE PROCEDURE stu_info(IN name CHAR(8))
BEGIN
SELECT s.学号,姓名,课程编号,分数 FROM student_info s,grade g
WHERE s.学号=g.学号 and 姓名=name;
END @@
使用CALL命令执行存储过程stu_info,其参数值为'张青平'。
DELIMITER ;
CALL stu_info('张青平');

DELIMITER @@
CREATE PROCEDURE stu_info(IN name CHAR(8))
BEGIN
SELECT s.学号,姓名,课程编号,分数 FROM student_info s,grade g
WHERE s.学号=g.学号 and 姓名=name;
END @@
DELIMITER ;
CALL stu_info('张青平');



2.使用studentsdb数据库中的student_info表、curriculum表、grade表。
(1)创建一个存储过程stu_grade,查询学号为0001的学生的姓名、课程名称、分数。

DELIMITER @@
CREATE PROCEDURE stu_grade(sno varchar(8))
BEGIN
SELECT 姓名,课程名称,分数 FROM student_info s,grade g,curriculum c
WHERE s.学号=g.学号 and g.课程编号=c.课程编号;
END @@


(2)调用存储过程stu_grade。

DELIMITER ;
CALL stu_grade('0001');


3.使用studentsdb数据库中的student_info表、curriculum表、grade表。
(1)创建存储过程stu_name,当任意输入一个学生的姓名时,查看其课程的最高分、最低分、平均分。

1.DELIMITER @@
CREATE PROCEDURE stu_name(name varchar(8))
BEGIN
SELECT max(分数) as 最高分,min(分数) as 最低分,avg(分数) as 平均分 from student_info s,grade g,curriculum c
where s.学号=g.学号 and g.课程编号=c.课程编号 AND 姓名=NAME;
END @@


(2)调用存储过程stu_name。

2.DELIMITER ;
CALL stu_name('张青平');


(3)删除存储过程stu_name。

3.drop PROCEDURE stu_name;


4.使用studentsdb数据库中的grade表。
(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生选修课程的门数。

1.DELIMITER @@
CREATE PROCEDURE stu_g_r(sno varchar(10))
BEGIN
SELECT count(课程名称) FROM grade g,curriculum c
WHERE g.课程编号=c.课程编号  and 学号=sno;
END @@


(2)执行存储过程stu_g_r,输入学号0002。

2.DELIMITER ;
CALL stu_g_r('0002');


(3)显示0002号学生的选课门数。

3.DELIMITER ;
CALL stu_g_r('0002');


5.使用studentsdb数据库中的curriculum表、grade表。
(1)创建一个存储函数num_func,统计指定课程名称的选课人数

1.SET GLOBAL log_bin_trust_function_creators=1;
DELIMITER @@
CREATE FUNCTION num_func(cname varchar(20))
RETURNS INT
BEGIN
DECLARE num INT;
SELECT COUNT(*) INTO num from grade g,curriculum c where g.课程编号=c.课程编号 AND c.课程名称=cname;
RETURN num;
END @@


(2)执行存储函数num_func,查看“C语言程序设计”选课人数。

2.DELIMITER ;
SELECT num_func('C语言程序设计');


6.使用studentsdb数据库中的curriculum表、grade表。
(1)创建一个存储函数avg_func,通过游标统计指定课程的平均分。

DELIMITER @@
CREATE FUNCTION avg_func(cname VARCHAR(50))
RETURNS DECIMAL
   BEGIN
    DECLARE v_acg DECIMAL;
		DECLARE avg_cur CURSOR FOR SELECT avg(分数) FROM grade g, curriculum c
			WHERE g.课程编号 = c.课程编号 AND 课程名称 = cname;
		OPEN avg_cur;
		FETCH avg_cur INTO v_acg;
		CLOSE avg_cur;
		RETURN v_acg;
	 END @@


(2)执行存储函数avg_func,查看“C语言程序设计”课程平均分。

DELIMITER ;
SELECT avg_func('c语言程序设计');


(3)删除存储函数avg_func。

DROP FUNCTION avg_func;


二、实验思考
1.存储函数和存储过程如何将运算结果返回给外界?
存储函数通过return语句返回函数值
存储过程通过out/inout 参数将结果返回
2.存储函数有OUT参数、INOUT参数吗?
没有
3.使用游标的步骤。
定义游标
打开游标
提取数据
关闭游标