> 技术文档 > 数据库原理及应用mysql版陈业斌实验五_数据库原理及应用mysql版陈业斌 存储过程

数据库原理及应用mysql版陈业斌实验五_数据库原理及应用mysql版陈业斌 存储过程


🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客
🌅主页:猫咪-9527-CSDN博客 

“欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。”

目录

实验五存储程序

1.实验数据如下

2. 插入数据

3.实验内容

5-1 创建存储过程 pro_fndname

5-2 设计函数 count_credit

5-3 创建存储过程p_count_credit

5-4 创建触发器 sum_credit

5-5 创建级联删除触发器 delstudent_score


实验五存储程序

【实验目的】

掌握存储函数、存储过程与触发器等存储程序的相关操作方法,理解存储函数、存储过程与触发器的作用。

1.实验数据如下

student 表(学生表)

CREATE TABLE student ( sno CHAR(5) PRIMARY KEY, snme VARCHAR(20) NOT NULL, sdept VARCHAR(20) NOT NULL,  sclass CHAR(2) NOT NULL,  ssex CHAR(1), birthday DATE,totalcredit DECIMAL(4,1) );

course 表(课程表)

CREATE TABLE course ( cno CHAR(3) PRIMARY KEY, cname VARCHAR(50),  ctime DECIMAL(3,0),  credit DECIMAL(3,1) );

teacher 表(教师表)

CREATE TABLE teacher ( tno CHAR(6) PRIMARY KEY,  tname VARCHAR(20),  tsex CHAR(1), tdept VARCHAR(20)  );

score 表(成绩表)

CREATE TABLE score ( sno CHAR(5), cno CHAR(3), tno CHAR(6), grade DECIMAL(5,1),  PRIMARY KEY (sno, cno, tno), CONSTRAINT fk_sno FOREIGN KEY(sno) REFERENCES student(sno), CONSTRAINT fk_cno FOREIGN KEY(cno) REFERENCES course(cno), CONSTRAINT fk_tno FOREIGN KEY(tno) REFERENCES teacher(tno));

2. 插入数据

student 表中的数据

INSERT INTO student VALUES(\'96001\', \'马小燕\', \'计算机\', \'01\', \'女\', \'2000/01/02\', 0);INSERT INTO student VALUES(\'96002\', \'黎明\', \'计算机\', \'01\', \'男\', \'2000/03/05\', 0);INSERT INTO student VALUES(\'96003\', \'刘东明\', \'数学\', \'01\', \'男\', \'2000/10/05\', 0);INSERT INTO student VALUES(\'96004\', \'赵志勇\', \'信息\', \'02\', \'男\', \'2000/08/08\', 0);INSERT INTO student VALUES(\'97001\', \'马蓉\', \'数学\', \'02\', \'女\', \'2001/03/04\', 0);INSERT INTO student VALUES(\'97002\', \'李成功\', \'计算机\', \'01\', \'男\', \'2001/09/10\', 0);INSERT INTO student VALUES(\'97003\', \'黎明\', \'信息\', \'03\', \'女\', \'2002/02/08\', 0);INSERT INTO student VALUES(\'97004\', \'李丽\', \'计算机\', \'02\', \'女\', \'2002/01/05\', 0);INSERT INTO student VALUES(\'96005\', \'司马志明\', \'计算机\', \'02\', \'男\', \'2001/11/23\', 0);

course 表中的数据

INSERT INTO course VALUES(\'001\', \'数学分析\', 64, 4);INSERT INTO course VALUES(\'002\', \'普通物理\', 64, 4);INSERT INTO course VALUES(\'003\', \'微机原理\', 56, 3.5);INSERT INTO course VALUES(\'004\', \'数据结构\', 64, 4);INSERT INTO course VALUES(\'005\', \'操作系统\', 56, 3.5);INSERT INTO course VALUES(\'006\', \'数据库原理\', 56, 3.5);INSERT INTO course VALUES(\'007\', \'编译原理\', 48, 3);INSERT INTO course VALUES(\'008\', \'程序设计\', 32, 2);

teacher 表中的数据

INSERT INTO teacher VALUES(\'052501\', \'王成刚\', \'男\', \'计算机\');INSERT INTO teacher VALUES(\'052502\', \'李正科\', \'男\', \'计算机\');INSERT INTO teacher VALUES(\'052503\', \'严敏\', \'女\', \'数学\');INSERT INTO teacher VALUES(\'052504\', \'赵高\', \'男\', \'数学\');INSERT INTO teacher VALUES(\'052505\', \'刘玉兰\', \'女\', \'计算机\');INSERT INTO teacher VALUES(\'052506\', \'王成刚\', \'男\', \'信息\');INSERT INTO teacher VALUES(\'052507\', \'马悦\', \'女\', \'计算机\');

score 表中的数据

INSERT INTO score VALUES(\'96001\', \'001\', \'052503\', 77.5);INSERT INTO score VALUES(\'96001\', \'003\', \'052501\', 89);INSERT INTO score VALUES(\'96001\', \'004\', \'052502\', 86);INSERT INTO score VALUES(\'96001\', \'005\', \'052505\', 82);INSERT INTO score VALUES(\'96002\', \'001\', \'052504\', 88);INSERT INTO score VALUES(\'96002\', \'003\', \'052502\', 92.5);INSERT INTO score VALUES(\'96002\', \'006\', \'052507\', 90);INSERT INTO score VALUES(\'96005\', \'004\', \'052502\', 92);INSERT INTO score VALUES(\'96005\', \'005\', \'052505\', 90);INSERT INTO score VALUES(\'96005\', \'006\', \'052505\', 89);INSERT INTO score VALUES(\'96005\', \'007\', \'052507\', 78);INSERT INTO score VALUES(\'96003\', \'001\', \'052504\', 69);INSERT INTO score VALUES(\'97001\', \'001\', \'052504\', 96);INSERT INTO score VALUES(\'97001\', \'008\', \'052505\', 95);INSERT INTO score VALUES(\'96004\', \'001\', \'052503\', 87);INSERT INTO score VALUES(\'96003\', \'003\', \'052501\', 91);INSERT INTO score VALUES(\'97002\', \'003\', \'052502\', 91);INSERT INTO score VALUES(\'97002\', \'004\', \'052505\', NULL);INSERT INTO score VALUES(\'97002\', \'006\', \'052507\', 92);INSERT INTO score VALUES(\'97004\', \'005\', \'052502\', 90);INSERT INTO score VALUES(\'97004\', \'006\', \'052501\', 85);

 注:把上面的实验数据添加上再开始实验。

3.实验内容

5-1 创建存储过程 pro_fndname

存储过程 profndname 通过模糊查询学生姓名,输入一个汉字,返回所有包含该汉字的学生记录。

delimiter ##create procedure pro_fndname(in seach_char char(1))begin select *from student where snme like concat(\'%\',seach_char,\'%\');end ##delimiter ;

5-2 设计函数 count_credit

函数 countcredit 根据学号计算学生的总学分,前提是成绩大于或等于60分时才能获得课程学分。

delimiter ## create Function count_credit(v_sno char(6)) returns int reads sql data Begin declare sums float ; select ifnull(sum(credit),0) into sums from course natural join score where grade >=60 and v_sno=sno; return sums; end ## delimiter ;

5-3 创建存储过程p_count_credit

存储过程 p_count_credit 使用 countcredit 函数更新 student 表中的总学分。

delimiter ## create procedure p_count_credit() begin declare v_sno varchar(20); declare v_credit int default 0; declare stucur cursor for select sno from student; declare exit handler for not found close stucur ; open stucur; while true do fetch stucur into v_sno; update student set totalcredit =count_credit(v_sno) where sno=v_sno; end while; close stucur; end ## delimiter ;

 

5-4 创建触发器 sum_credit

触发器 sum_credit 在向 score 表插入记录时,自动更新 student 表中的总学分。只有成绩大于或等于60分时,才会增加学分。

delimiter ## create trigger sum_credit after insert on score for each row Begin if(new.grade>=60) then update student set totalcredit =totalcredit+(select credit from course where cno=new.cno) where student.sno=new.sno; end if; end ## delimiter ; 

5-5 创建级联删除触发器 delstudent_score

触发器 delstudent_score 实现级联删除,当删除 student 表中的学生记录时,会同时删除 score 表中对应学号的成绩记录。

delimiter ## create trigger del_studnet_score before delete on student for each row begin delete from score where sno=old.sno; end ## delimiter ;

删除前:

 删除后: