这个作业属于哪个课程 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 @@
使用CALL命令执行存储过程stu_info,其参数值为'张青平'。
DELIMITER ;
CALL stu_info('张青平');


(2)使用studentsdb数据库中的student_info表、curriculum表、grade表。

(1)创建一个存储过程stu_grade,查询学号为0001的学生的姓名、课程名称、分数。
(2)调用存储过程stu_grade。

DELIMITER @@
CREATE PROCEDURE stu_grade()
BEGIN
  SELECT 姓名,课程名称,分数 FROM student_info s,curriculum c,grade g
  WHERE s.`学号`=g.`学号` AND c.`课程编号`=g.`课程编号` AND s.`学号`='0001';
end @@
DELIMITER ;
CALL stu_grade();


(3)使用studentsdb数据库中的student_info表、curriculum表、grade表。

(1)创建存储过程stu_name,当任意输入一个学生的姓名时,查看其课程的最高分、最低分、平均分。
(2)调用存储过程stu_name。
(3)删除存储过程stu_name。

DELIMITER @@
CREATE PROCEDURE stu_name(IN name CHAR(8))
BEGIN
  SELECT `姓名`,MAX(g.分数) 最高分,MIN(g.分数) 最低分,AVG(g.分数) 平均分 FROM student_info s,curriculum c,grade g
  WHERE s.`学号`=g.`学号` AND c.`课程编号`=g.`课程编号` AND 姓名=name GROUP BY 姓名;
END @@
DELIMITER ;
CALL stu_name('张青平');
DROP PROCEDURE stu_name;



(4)使用studentsdb数据库中的grade表。

(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生选修课程的门数。
(2)执行存储过程stu_g_r,输入学号0002。
(3)显示0002号学生的选课门数。

DELIMITER @@
CREATE PROCEDURE stu_g_r(IN cno CHAR(4),OUT num INT)
BEGIN
   SELECT count(*) INTO num FROM grade WHERE 学号=cno;
end @@
DELIMITER ;
CALL stu_g_r('0002',@num);
SELECT @num;


(5)使用studentsdb数据库中的curriculum表、grade表。

(1)创建一个存储函数num_func,统计指定课程名称的选课人数。
(2)执行存储函数num_func,查看“C语言程序设计”选课人数。

SET GLOBAL log_bin_trust_function_creators=1;
DELIMITER @@
CREATE FUNCTION num_func(cname VARCHAR(50))
RETURNS INT
BEGIN
  DECLARE num INT;
  SELECT COUNT(*) INTO num FROM grade g,curriculum c
  WHERE g.课程编号=c.课程编号 AND c.课程名称=cname;
  RETURN num;
END @@
DELIMITER ;
SELECT num_func('C语言程序设计');



(6)使用studentsdb数据库中的curriculum表、grade表。

(1)创建一个存储函数avg_func,通过游标统计指定课程的平均分。
(2)执行存储函数avg_func,查看“C语言程序设计”课程平均分。
(3)删除存储函数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 @@
SELECT avg_func('C语言程序设计') 课程平均分;
DROP FUNCTION avg_func;



二、实验思考

1.存储函数和存储过程如何将运算结果返回给外界?

存储函数和存储过程可以使用以下方式将运算结果返回给外界:

(1)返回值:存储函数可以通过返回值将计算结果返回给外界。函数可以定义一个特定的返回数据类型,并使用RETURN语句将结果返回给调用者。调用者可以接收函数的返回值并进行后续处理。
(2)OUT参数:存储过程可以使用OUT参数将计算结果返回给外界。OUT参数是在存储过程中声明的参数,用于存储过程内部计算结果的输出。调用存储过程时,可以传递一个用于接收OUT参数值的变量,存储过程在执行过程中将计算结果赋值给该变量。
(3)游标:存储过程可以使用游标来处理和返回结果集。游标是一种用于遍历查询结果集的数据结构。存储过程可以声明一个游标,并使用OPEN语句打开游标,然后通过FETCH语句逐行获取结果集中的数据。最后,通过CLOSE语句关闭游标。调用存储过程时,可以使用游标返回结果集给外界。

2.存储函数有OUT参数、INOUT参数吗?

存储函数在大多数数据库管理系统中通常只能返回一个值作为函数的结果,而不能使用OUT参数或INOUT参数。存储函数的主要目的是根据输入参数进行计算并返回一个结果,因此通常不需要使用OUT参数或INOUT参数。

OUT参数和INOUT参数通常用于存储过程中,用于传递数据给存储过程并返回修改后的结果。OUT参数用于将存储过程内部计算的结果返回给调用者,而INOUT参数则允许传递参数的初始值给存储过程,并在存储过程内部对其进行修改后再返回给调用者。

3.使用游标的步骤。

(1)声明游标:在存储过程中使用DECLARE语句声明一个游标,并指定游标的名称和查询语句。
(2)打开游标:使用OPEN语句打开游标,将查询结果集绑定到游标上。
(3)获取数据:使用FETCH语句逐行获取游标中的数据。可以使用FETCH NEXT语句获取下一行数据,也可以使用FETCH PRIOR、FETCH FIRST或FETCH LAST等语句获取其他行的数据。
(4)处理数据:对于每一行获取的数据,可以进行相应的处理操作,例如输出到外界或进行计算。
(5)关闭游标:在处理完所有数据后,使用CLOSE语句关闭游标,释放相关资源

posted on 2023-10-30 15:40  renhui  阅读(55)  评论(0编辑  收藏  举报