mysql--期中测试
存储过程、存储函数、触发器复习题
学生信息表
课程表
成绩表
创建一个存储过程,按专业和性别查询学生的信息。
delimiter $$
create PROCEDURE select_by_pro_sex(IN pro char(10),IN sex char(2))
BEGIN
select * from student where stupro=pro and stuSex=sex;
END$$
delimiter;
call select_by_pro_sex('计算机','男');
创建一个存储过程,向课程表中插入一门课程的信息,用带参的存储过程实现
delimiter $$
create PROCEDURE pro_insert(IN kid CHAR(3),IN kname char(16),IN kterm INT,IN ktime INT, IN kcredit INT)
BEGIN
insert into kc VALUES(kid,kname,kterm,ktime,kcredit);
END$$
delimiter;
CALL pro_insert('104','mysql',2,80,6);
创建一个存储过程,统计某一个专业学生的人数,若人数大于100人则给用户变量 @str赋值为“大专业”,否则赋值为“小专业”,在测试存储过程时输出用户变量的值。
delimiter ##
create PROCEDURE pro_renshu(in renshu int ,out str char(6))
BEGIN
if renshu>100 then set str='大专业';
ELSE set str='小专业';
end if;
END ##
delimiter ;
set @str=null;
CALL pro_renshu('101',@str);
SELECT @str;
创建一个存储过程,有两个输入参数:学号和课程名,要求当某学生某门课程的成绩小于60分时将其学分修改为零,大于等于60分时将学分修改为此课程的学分。
DELIMITER $$
CREATE PROCEDURE XSCJ.DO_UPDATE(IN XH CHAR(6), IN KCM CHAR(16))
BEGIN
DECLARE KCH CHAR(3);
DECLARE XF TINYINT;
DECLARE CJ TINYINT;
SELECT 课程号, 学分 INTO KCH, XF FROM KC WHERE 课程名=KCM;
SELECT 成绩 INTO CJ FROM XS_KC WHERE 学号=XH AND 课程号=KCH;
IF CJ<60 THEN
UPDATE XS_KC SET 学分=0 WHERE 学号=XH AND 课程号=KCH;
ELSE
UPDATE XS_KC SET 学分=XF WHERE 学号=XH AND 课程号=KCH;
END IF;
END$$
DELIMITER ;
描述一下存储过程和存储函数的区别?
(1)存储函数不能拥有输出参数,因为存储函数本身就是输出参数;
(2)不能用CALL语句来调用存储函数;
(3)存储函数必须包含一条RETURN语句,而这条特殊的SQL语句不允许包含于存储过程中。
创建一个存储函数,根据学生的学号返回某个学生的姓名。
DELIMITER $$
create FUNCTION fun_GetName(xh char(6))
RETURNS char(6)
BEGIN
RETURN (SELECT stuName from student where stuNo=xh);
END$$
DELIMITER;
创建一个存储函数来删除Score表中有但student表中不存在的学号。
DELIMITER $$
create FUNCTION fun_DelStu(xh char(6))
RETURNS boolean
BEGIN
DECLARE stu char(6);
select stuno into stu from student where stuNo=xh;
IF stu is NULL THEN
DELETE from score where stuNo=xh;
RETURN TRUE;
ELSE