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

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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/uzz/cs3
这个作业要求在哪里 https://edu.cnblogs.com/campus/uzz/cs3/homework/13095
这个作业的目标 存储过程和存储函数

一.操作题。

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('张青平');


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

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

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 @@


(2)调用存储过程stu_grade:

DELMITER ;
CALL stu_grade();

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

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

DELIMITER @@
CREATE PROCEDURE stu_name(IN NAME CHAR(8))
BEGIN
 SELECT 姓名,MAX(g.分数) AS 最高分,MIN(g.分数) AS 最低分,AVG(g.分数) AS 平均分
 FROM student_info s,curriculum c,grade g
 WHERE s.学号=g.学号 AND c.课程编号=g.课程编号 AND 姓名=name 
 GROUP BY 姓名;
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 xh char(4),OUT ms INT)
BEGIN 
 SELECT COUNT(*) INTO ms FROM grade 
 WHERE 学号=xh;
END @@


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

DELIMITER ;
CALL stu_g_r('0002',@ms);


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

SELECT @ms;

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

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

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


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

DELIMITER ;
SELECT num_func('C语言程序设计') AS 选课人数;

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

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

DELIMITER @@
CREATE FUNCTION avg_func(kcmc 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 课程名称=kcmc;
 OPEN avg_cur;
 FETCH avg_cur INTO v_acg;
 CLOSE avg_cur;
 RETURN v_acg;
END @@


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

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


(3)删除存储函数avg_func:

DROP FUNCTION avg_func;

二.实验思考。

1.存储函数和存储过程如何将运算结果返回给外界?
(1)使用SELECT语句返回结果:在MySQL存储过程中,可以使用SELECT语句来返回结果集。
(2)使用OUT参数返回结果:对于需要返回多个值或者结果集的情况,可以定义一个或多个OUT参数,在存储函数或者存储过程执行完毕后将计算结果赋值给这些参数,然后由调用方获取这些参数的值。
(3)使用游标返回结果:如果需要返回一个结果集,可以使用游标来实现。存储函数或者存储过程可以声明一个或多个游标,并且通过OPEN、FETCH和CLOSE语句来操作这些游标。
(4)使用RETURN语句:存储函数和存储过程可以使用RETURN语句来返回一个值或者一个结果集。对于存储函数,可以在函数体中使用RETURN语句返回一个标量值(例如整数、字符串等)。
2.存储函数有OUT参数、INOUT参数吗?
(1)存储函数的参数类型类似于IN参数,没有OUT参数、INOUT参数,而存储过程的参数类型有三种,即IN参数、OUT参数、INOUT参数
(2)存储函数和存储过程统称为存储例程(stored routine)。两者的定义语法很相似,但却是不同的内容。存储函数限制比较多,比如不能用临时表,只能用表变量。还有一些函数都不可用等等。而存储过程的限制相对就比较少。
一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
3.使用游标的步骤。
(1)声明游标:首先需要使用DECLARE语句声明一个游标,并指定游标的名称和查询语句;
(2)打开游标:使用OPEN语句打开游标,使其准备好进行数据遍历;
(3)获取数据:使用FETCH语句从游标中获取一行数据。可以使用不同的FETCH语句来获取不同类型的数据;
(4)处理数据:获取到数据后,可以对其进行处理。可以使用游标的当前行数据进行各种操作,例如插入、更新、删除等;
(5)关闭游标:在完成数据处理后,使用CLOSE语句关闭游标,释放资源。
posted @ 2023-11-02 08:53  慕言ya  阅读(205)  评论(0编辑  收藏  举报