qq

发布时间 2023-10-30 15:46:24作者: James_Harden1

一、练习

1.输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名的学生的各科成绩。

USE studentsdb;
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。

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.存储函数和存储过程如何将运算结果返回给外界?

    存储函数和存储过程都是数据库中的可重用代码块,它们可以在数据库中进行调用和执行。它们的主要区别在于它们的用途和语法。存储函数通常是用于执行特定的计算或转换,并返回一个值。
    存储函数可以接受参数,并且可以在函数体内进行各种计算和逻辑操作。在函数执行完成后,存储函数将返回一个值给调用者。这个返回值可以是任何数据类型,例如整数、字符串、日期等。存储过程则是一组为了完成特定任务而编写的SQL语句集合。它可以接受参数、执行各种操作(例如插入、更新、删除数据等)以及进行条件判断和循环控制等。
    与存储函数不同的是,存储过程不直接返回一个值,而是通过输出参数将结果传递给调用者。存储过程的输出参数可以是任何数据类型,例如整数、字符串、日期等。无论是存储函数还是存储过程,它们都将运算结果返回给调用者。

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

有,存储函数可以有OUT参数和INOUT参数。这些参数都是函数定义的参数,用于从函数传递数据给调用者。
OUT参数是用于从函数向调用者传递数据的参数。在函数内部,OUT参数可以被赋予一个初始值,然后在函数执行过程中被修改。在函数执行完成后,OUT参数的值将被返回给调用者。
INOUT参数是既可以作为输入参数(input)也可以作为输出参数(output)的参数。在函数内部,INOUT参数可以被赋予一个初始值,然后在函数执行过程中被修改。在函数执行完成后,INOUT参数的值将被返回给调用者。通过使用OUT参数和INOUT参数,存储函数可以向调用者传递更多的数据和结果。这使得存储函数更加灵活和有用,可以根据不同的需求和情况使用不同的参数类型。

3.使用游标的步骤。

1.声明游标:首先需要声明一个游标,指定游标的名称、数据类型和定义游标时要使用的查询语句。
2.打开游标:通过使用DECLARE语句声明游标后,必须使用OPEN语句打开游标,以便在存储过程或函数中使用。
3.取得数据:使用FETCH语句获取游标中的数据,并将其存储在变量中。
4.处理数据:在游标中获取数据后,可以对其进行处理,例如进行计算、转换数据类型等。
5.关闭游标:当存储过程或函数执行完成后,应该关闭游标以释放资源。
6.释放游标:最后需要释放游标,以完全释放资源并避免内存泄漏。