当前位置:文档之家› 实验报告四 MYSQL存储过程与触发器

实验报告四 MYSQL存储过程与触发器

计算机科学系实验报告实验要求:(在导入的教学管理STM数据库中完成):1、基本储存过程的创建①创建一存储过程get_student_num,利用输出参数形式获取学生人数信息。

并利用CALL调用该存储过程查看结果。

DELIMITER $$CREATE PROCEDURE `stm`.`get_student_num`(OUT count_num CHAR(10))BEGINSELECT COUNT(sno) INTO count_num FROM student;END$$DELIMITER ;CALL get_student_num(@count_num)SELECT @count_num②创建一存储过程get_student_by_sno,通过输入学生编号作为参数,获得该学生的记录信息。

并利用CALL调用该存储过程查看结果。

DELIMITER $$CREATE PROCEDURE `stm`.`get_student_by_sno`(IN sno_in CHAR(10))BEGINSELECT *FROM student WHERE sno = sno_in;END$$DELIMITER ;CALL get_student_by_sno('900262')③创建一存储过程update_sage_by_sno,通过输入学生编号、年龄作为参数,将指定学生的年龄更改为指定的年龄。

并利用CALL调用该存储过程查看结果。

DELIMITER $$CREATE PROCEDURE `stm`.`update_sage_by_sno`(IN sno_in CHAR(13) ,sage_in INT)BEGINUPDATE student SET sage=sage_in WHERE sno=sno_in;END$$DELIMITER ;CALL update_sage_by_sno('900125',20)④创建一存储过程delete_student_by_sno,通过输入学生编号作为参数,删除该学生记录。

并利用CALL调用该存储过程查看结果。

DELIMITER $$CREATE PROCEDURE `stm`.`delete_student_by_sno`(IN sno_in CHAR(10))BEGINDELETE FROM student WHERE sno=sno_in;END$$DELIMITER ;CALL delete_student_by_sno('900106')⑤创建一存储过程insert_student,通过输入相关信息作为参数,向学生表中添加一学生记录。

并利用CALL调用该存储过程查看结果。

DELIMITER $$CREATE PROCEDURE `stm`.`insert_student`(IN snox CHAR(10),snamex VARCHAR(10),ssexx VARCHAR(1),sagex SMALLINT(5),enterdatex DATETIME)BEGININSERT INTO student (sno,sname,ssex,sage,enterdate)VALUES (snox,snamex,ssexx,sagex,enterdatex);END$$DELIMITER ;CALL insert_student('900104','里斯','男',21,'2010-09-12')2、基本函数过程的创建①创建一存储函数get_student_num,利用输出参数形式获取学生人数信息。

并利用select调用该存储函数查看结果。

DELIMITER $$CREATE FUNCTION `stm`.`get_student_num`()RETURNS INTBEGINDECLARE num INT;SELECT COUNT(*) INTO num FROM student;RETURN num;END$$DELIMITER ;SELECT get_student_num()②创建一存储函数get_student_by_sno,通过输入学生编号作为参数,获得该学生的记录信息。

并利用select调用该存储函数查看结果。

DELIMITER $$CREATE FUNCTION `stm`.`get_student_by_sno`(snox CHAR(10))RETURNS CHAR(100)BEGINDECLARE snamex VARCHAR(10);DECLARE ssexx VARCHAR(1);DECLARE sagex SMALLINT;DECLARE enterdatex DATETIME;DECLARE record VARCHAR(100);SELECT sname,ssex,sage,enterdate INTO snamex,ssexx,sagex,enterdatex FROM studentWHERE sno=snox;SET record=CONCAT_WS(',',snox,snamex,ssexx,sagex,enterdatex);RETURN record;END$$DELIMITER ;SELECT get_student_by_sno('900106')3、利用SHOW CREATE {PROCEDURE | FUNCTION} sp_name查看存储过程或函数的定义。

SHOW CREATE PROCEDURE delete_student_by_sno\GSHOW CREATE FUNCTION get_student_by_sno\G4、定义条件和处理①创建一存储过程insert_student_condition,利用条件定义,当主键重复时结束存储过程,并提示“学生主键重复”。

DELIMITER $$CREATE PROCEDURE insert_student_condition(snox CHAR(10),snamex VARCHAR(20),ssexx VARCHAR(2),sagex SMALLINT,enterdatex DATETIME)BEGINDECLARE EXIT HANDLER FOR SQLSTATE '23000'LECT '学生主键重复';INSERT INTO student(sno,sname,ssex,sage,enterdate)VALUES(snox,snamex,ssexx,sagex,enterdatex);END$$DELIMITER ;CALL insert_student_condition('900106','毕琴','女',20,'2010-09-15');②创建一存储过程insert_student_condition_user,利用条件定义,当插入学生的性别不为“男”或“女”时结束存储过程,并提示“学生性别不正确”。

DELIMITER $$CREATE PROCEDURE insert_student_condition_user(IN snox CHAR(10),snamex VARCHAR(20),ssexx CHAR(2),sagex SMALLINT,enterDatex DATETIME)BEGINDECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SELECT '学生性别不正确';IF ssexx='男'OR ssexx='女' THENINSERT INTO student(sno,sname,ssex,sage,enterDate)VALUES (snox,snamex,ssexx,sagex,enterDatex) ;ELSEINSERT INTO xx VALUES('xxxxx');END IF;END$$DELIMITER;CALL insert_student_condition_user('900134','向阳','中',20,'2010-09-12');CALL insert_student_condition_user('900134','向阳','女',20,'2010-09-12');5、光标的使用①创建一存储过程update_student_borthyear,在学生表中添加字段”borthyear”(出生年份),在存储过错中利用光标,通过学生年龄计算出出生年份并修改表中对应字段。

DELIMITER $$CREATE PROCEDURE update_student_borthyear(IN snox CHAR(10))BEGINDECLARE Sagex VARCHAR(10);DECLARE borthyearx INT;DECLARE cur1 CURSOR FOR SELECT sage,borthyear FROM student;DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur1;OPEN cur1;REPEATFETCH cur1 INTO Sagex, borthyearx;UPDATE student SET borthyear=2012-SageWHERE sno=snox;UNTIL 0 END REPEAT;CLOSE cur1;END$$DELIMITER ;CALL update_student_borthyear('900104');6、触发器①创建一更新前触发器trigger_student_sc_update,实现在更新学生表的sno时,级联更新对于sc中的相关记录的sno值。

DELIMITER $$CREATE TRIGGER `stm`.`trigger_student_sc_update` AFTER UPDATEON student FOR EACH ROWBEGINDECLARE newsno CHAR(10);DECLARE oldsno CHAR(10);SET newsno=new.sno;SET oldsno=old.sno;IF newsno<>oldsno THENUPDATE sc SET sno=newsno WHERE sno=oldsno;END IF;END$$DELIMITER ;UPDATE student SET sno='900176' WHERE sname='楼飞';②创建一删除前触发器trigger_student_sc_delete,实现在删除一名学生时,级联删除sc中的相关记录。

相关主题