任务描述
本关任务:创建存储过程 pro_findname 对学生姓名进行模糊查找,输入任一字输出姓名中含有该字的全部学生。
相关知识
为了完成本关任务,你需要掌握: 1.存储过程的定义; 2.存储过程的创建和查询; 3.存储过程的查询和删除。
存储过程的定义
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
简单的说存储过程就是具有名字的一段代码,用来完成一个特定的功能。
存储过程的创建和查询
创建存储过程:create procedure 存储过程名(参数)
每个存储的程序都包含一个由 SQL 语句组成的主体。此语句可能是由以分号(;)字符分隔的多个语句组成的复合语句。例如:
执行存储过程:call 存储过程名
创建带有参数的存储过程 存储过程的参数有三种:
存储过程的查询和删除
我们如何在数据库中查询我们已经创建过的存储过程呢:
查看存储过程的详细定义信息:
当我们不再需要某个存储过程时,我们可以使用:
编程要求
根据提示,在右侧编辑器补充代码,创建存储过程pro_findname 对学生姓名进行模糊查找,输入任一字输出姓名中含有该字的全部学生。
测试说明
平台会对你编写的代码进行测试,将调用你编写的存储过程:call pro_findname('明'),具体输出请参考右侧测试集。
use teachingdb; /****请在此编写代码,操作完毕之后点击评测******/ /**********Begin**********/ delimiter $$ create procedure pro_findname(in name char(3)) Begin select * from student where sname like concat('%',name,'%'); End $$ delimiter ; /**********End**********/
本关任务:设计函数 count_credit,根据学号计算该学生的总学分,只有当成绩大于等于60分时才能获得该门课程的学分。
为了完成本关任务,你需要掌握:
自定义函数的定义
自定义函数的创建
语法如下:
CREATE FUNCTION <函数名> ( [ <参数1> <类型1> [ , <参数2> <类型2>] ] … ) RETURNS <类型> <函数主体> |
根据提示,在右侧编辑器补充代码,设计函数 count_credit,根据学号计算该学生的总学分,只有当成绩大于等于60分时才能获得该门课程的学分。
平台会对你编写的代码进行测试:本题中该学生选“马蓉”,学号为“97001”)
use teachingdb; /****请在此编写代码,操作完毕之后点击评测******/ /**********Begin**********/ delimiter $$ CREATE FUNCTION count_credit(stuno char(6)) returns int reads sql data Begin declare stucno char(3) ; declare cred int default 0; declare t_cred int default 0; declare done int default false; declare stucur cursor for select cno from score where sno=stuno and grade>=60; declare continue handler for not found set done=true; open stucur; loop_cursor:loop fetch stucur into stucno; if done then leave loop_cursor; End if; select credit into cred from course where cno=stucno; set t_cred=t_cred+cred; end loop; return t_cred; end$$ delimiter ; /**********End**********/
任务描述
本关任务:创建存储过程 p_count_credit,调用 count_credit 函数更新学生表的总学分值。
相关知识
为了完成本关任务,你需要掌握: 1.存储过程的定义; 2.存储过程的创建和查询; 3.存储过程的查询和删除。
存储过程的定义
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
简单的说存储过程就是具有名字的一段代码,用来完成一个特定的功能。
编程要求
根据提示,在右侧编辑器补充代码,创建存储过程 p_count_credit,调用count_credit 函数更新学生表的总学分值。
测试说明
平台会对你编写的代码进行测试,将调用你编写的存储过程p_count_credit,函数的count_credit的功能和第2关中的相同,具体输出请参考右侧测试集。
use teachingdb; /****请在此编写代码,操作完毕之后点击评测******/ /**********Begin**********/ DELIMITER $$ CREATE PROCEDURE p_count_credit() BEGIN DECLARE stuno CHAR(6); DECLARE done int default false; DECLARE stucur CURSOR FOR SELECT sno FROM student; DECLARE CONTINUE HANDLER FOR not found set done=true; open stucur; loop_cursor:loop fetch stucur into stuno; if done then leave loop_cursor; end if; update student set totalcredit=count_credit(stuno) where sno=stuno; end loop; end$$ delimiter ; /**********End**********/
本关任务:创建触发器 sum_credit,实现对 student 表总学分的计算,当 score 中添加记录时,student 表总学分的值做相应改变。当课程成绩大于等于60分时,将该课程的学分加到该学生的总学分中。
为了完成本关任务,你需要掌握: 1.触发器的定义; 2.触发器的创建; 3.after 触发器。
触发器的定义
触发器(Trigger)是存储在系统内部的一段程序代码。
触发器和存储过程类似,可以把它看作是一个特殊的存储过程。两者的区别是,触发器无需人工调用,当程序满足定义条件时就会被 MySQL 自动调用。这些条件可以称为触发事件,包括 INSERT、UPDATE 和 DELETE 操作。
核心就是数据库 SQL 语言层面的代码封装与重用。
触发器的创建
after触发器
建一个触发器 t_d_s,当删除表 student 中某个学生的信息时,同时将 grade 表中与该学生有关的数据全部删除。
根据提示,在右侧编辑器补充代码,创建触发器 sum_credit,实现对 student 表总学分的计算,当 score 中添加记录时,student 表总学分的值做相应改变。当课程成绩大于等于60分时,将该课程的学分加到该学生的总学分中。
平台会对你编写的代码进行测试:平台会用“马小燕”为测试用例进行测试。
use teachingdb; /****请在此编写代码,操作完毕之后点击评测******/ /**********Begin**********/ delimiter $$ create trigger sum_credit after insert on score for each row Begin update student set totalcredit=totalcredit+ (select credit from course where cno=new.cno) where sno=new.sno and new.grade>=60; end $$ delimiter ; /**********End**********/
本关任务:创建级联删除触发器 del_student_score,当删除 student 表中的学生时,也删除 score 表中的对应学号的学生成绩记录。
见第4关。
根据提示,在右侧编辑器补充代码,创建级联删除触发器 del_student_score,当删除 student 表中的学生时,也删除 score 表中的对应学号的学生成绩记录。
use teachingdb; /****请在此编写代码,操作完毕之后点击评测******/ /**********Begin**********/ delimiter $$ drop trigger if exists del_student_score$$ create trigger del_student_score before delete on student for each row Begin delete from score where sno=old.sno; end$$ delimiter ; /**********End**********/