一、上机目的
1、掌握函数及自定义函数;
2、掌握存储过程;
3、掌握触发器;
4、掌握事件;
5、掌握预处理语句。
二、上机内容
(1)创建一个名为MyFun的不带参数的自定义函数,该函数的功能是从数据表C中查询C3的课程名,并调用函数。
DELIMITER $$
CREATE FUNCTION MyFun() RETURNS VARCHAR(20)
BEGIN
RETURN(SELECT CN FROM C WHERE CNo='C3');
END
$$
DELIMITER ;
SELECT MyFun();
(2)创建一个名为InsertFun的带参数的自定义函数,该函数的功能是向数据表C中插入课程的信息,并调用函数。
DELIMITER $$
CREATE FUNCTION insertFun(CnName VARCHAR(20),CNo VARCHAR(10),CT INT))
RETURNS VARCHAR(20)
BEGIN
INSERT C(CN,CNo,CT) VALUES(CnName,CNo,CT);
RETURN ('OK')
END
$$
DELIMITER ;
SELECT insertFun('ROSE','C8',64);
(3)创建一个名为MyProc的不带参数的存储过程,该存储过程的功能是从数据表S中查询所有男同学的信息,并执行存储过程。
DELIMITER $$
CREATE PROCEDURE MyProce()
BEGIN
SELECT * FROM S WHERE Sex='男';
END
$$
DELIMITER ;
CALL MyProce();
(4)创建一个名为InsertRecord的带参数的存储过程,该存储过程的功能是从数据表S中根据学号查询某一同学的信息,学号的值由参数提供,并执行存储过程。
DELIMITER $$
CREATE PROCEDURE insertRecord(IN Ssno VARCHAR(20))
BEGIN
SELECT SN,Dept FROM S WHERE Sno IN(Ssno);
END
$$
DELIMITER ;
CALL insertRecord('S1');
(5)创建一个触发器,该触发器的作用为:当在学生表S中根据学号删除某一个学生时,在学生选课表SC中的选课记录也全部被删除。
DELIMITER $$
CREATE TRIGGER delete_stu BEFORE DELETE
ON S FOR EACH ROW
BEGIN
DELETE FROM SC WHERE Sno=OLD.Sno;
END
$$
DELIMITER ;
DELETE FROM S WHERE Sno='S1';
(6)创建一个触发器,该触发器保证在学生选课表SC中添加新的记录时,新学生的学号Sno必须已经存在于学生表S中,如果不存在就提示错误提示“学生表S中没有该学生的基本信息,拒绝插入!”。
DELIMITER $$
CREATE TRIGGER insert_sc_data BEFORE insert
ON SC FOR EACH ROW
BEGIN
IF NOT EXISTS (SELECT * FROM S WHERE Sno=NEW.Sno)then
SELECT '学生表中没有该学生的基本信息,拒绝插入'into @msg;
else
select '插入成功'into @msg;
end if;
end
$$
SELECT @msg;
INSERT INTO SC VALUES('S7','C5','55');
SELECT @msg;
INSERT INTO SC VALUES('S5','C3','99');
SELECT @msg;
SELECT * FROM SC;
(7)创建一个一次性事件,在2分钟后向教师表T中添加一条学生记录,执行后事件不会被删除;
CREATE EVENT INSERT_DATA_EVENT
ON SCHEDULE
AT current_timestamp + interval 2 minute
on completion preserve
do insert into t values('T6','蔡琳','女',26,'讲师',1300,1500,'外语');
select * from t;
SHOW CREATE EVENT insert_data_event/G
(8)创建一个循环的事件,从现在开始,每分钟从数据表T查询的教师信息存储到一个新表TempTeach中,并在其创建时间的1个小时后过期。
create table TempTeach select * from t limit 0,0;
select * from TempTeach;
create event if not exists delete_event
on schedule every 1 minute
ends current_timestamp + interval 1 hour
on completion preserve
do insert into TempTeach select * from t limit 1,1;