DingCL

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

这个作业属于哪个课程 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 @@
DELIMITER ;
CALL stu_info('张青平');

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

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

DELIMITER @@
CREATE PROCEDURE stu_grade(IN xuehao CHAR(4))
BEGIN
SELECT s.姓名,c.课程名称,g.分数 FROM student_info s,grade g,curriculum c
WHERE s.学号=g.学号 AND g.课程编号=c.课程编号 AND s.学号=xuehao;
END@@

(2)调用存储过程stu_grade。

DELIMITER ;
CALL stu_grade('0001');

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

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

DELIMITER @@
CREATE PROCEDURE stu_name (IN name CHAR(8))
BEGIN
SELECT s.姓名,max(g.分数) 最高分,min(g.分数) 最低分,avg(g.分数) 平均分 FROM student_info s,grade g
WHERE s.学号=g.学号 AND s.姓名=name
GROUP BY name;
END@@

2)调用存储过程stu_name。

DELIMITER ;
CALL stu_name('刘东阳');

3)删除存储过程stu_name。

DROP PROCEDURE stu_name;

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

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

DELIMITER @@
CREATE PROCEDURE stu_g_r (IN xuehao char(4),OUT menshu DECIMAL(4,0))
BEGIN
SELECT count(课程编号) INTO menshu  FROM grade
WHERE  学号=xuehao;
END@@

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

DELIMITER ;
CALL stu_g_r('0001',@menshu);

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

SELECT @menshu 选课门数;

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

1)创建一个存储函数num_func,统计指定课程名称的选课人数。

SET GLOBAL log_bin_trust_function_creators =1;

DELIMITER @@
CREATE  FUNCTION num_func (classname char(50))
RETURNS  DECIMAL(2,0)
BEGIN
	RETURN(SELECT count(*) 选课人数 FROM grade g,curriculum c
		WHERE g.课程编号=c.课程编号 AND c.课程名称=classname);

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

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

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

1)创建一个存储函数avg_func,通过游标统计指定课程的平均分。

SET GLOBAL log_bin_trust_function_creators =1;

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

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

DELIMITER @@
SELECT avg_func('C语言程序设计') as 课程平均分;

3)删除存储函数avg_func。

DROP FUNCTION avg_func; 

END@@

二、实验思考

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

存储函数可以通过 RETURNS(确定函数返回值的数据类型),通过RETURN返回语句,也就是将运算结果返回给了外界
存储函数是一种接受参数并返回一个标量值或表值的SQL函数。

存储过程通常用于执行一系列SQL语句,而不是返回单个值。存储过程可以包含输入参数和输出参数,以便在过程执行期间将结果返回给外部调用者。
存储过程的结果通常不是一个标量值,而是通过输出参数、临时表、或结果集等方式返回。

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

没有,
存储过程才有OUT参数、INOUT参数,以及IN参数。
OUT参数为输出参数,该类型的参数值由存储过程写入。适用于存储过程向用户返回信息。
IN参数为输入参数,该类型的参数值由用户写入。并且只能被存储过程读取。
INOUT参数可以同时实现IN参数和OUT参数的特性,在过程中可以读取和写入。

3.使用游标的步骤。

1.声明游标,首先,需要声明一个游标变量,定义结果集的查询。游标声明通常在存储过程或函数的开始部分完成。
2.打开游标,使用OPEN语句来打开游标,准备开始遍历结果集。
3.提取数据,一旦读取了数据,可以对其进行处理,执行必要的操作。通常,这涉及到在循环中不断读取数据,直到没有更多的数据为止。
4.关闭游标,在完成操作后,使用CLOSE语句来关闭游标。并释放资源。

posted on 2023-11-03 22:17  DingCL  阅读(375)  评论(0)    收藏  举报