数据库原理实验五——触发器与存储过程(函数)
实验目的
- 熟练掌握存储过程/函数的创建和执行方法。
- 熟练掌握触发器的创建和执行方法。
实验内容
- 针对SPJ_MNG数据库,创建并执行如下存储过程。(共计40分)
(1) 创建一个没有参数的存储过程—jsearch1。该存储过程的作用是:当执行该存储过程时,将返回S表中北京供应商的所有信息。调用该存储过程并验证结果。(5分)
DELIMITER $$
CREATE PROCEDURE jsearch1()
BEGINSELECT * FROM SWHERE CITY = '北京';
END $$
验证
CALL jsearch1;
(2) 创建带输入参数的存储过程—jsearch2。该存储过程的作用是:当输入一个供应商所在城市名时(如北京),将返回该供应商的所有信息。调用存储过程并验证结果。(5分)
DELIMITER $$
CREATE PROCEDURE jsearch2(in city_in CHAR(45))
BEGINSELECT * FROM SWHERE CITY = city_in;
END $$
验证
CALL jsearch2('北京');
(3) 创建带输入参数和输出参数的存储过程(函数)—jsearch3。该存储过程的作用是:当输入一个供应商编号(输入参数SNO)时,将返回该供应商的名称(输出参数SNAME)。调用存储过程并验证结果。(5分)
DELIMITER $$
CREATE PROCEDURE jsearch3(in sno_in CHAR(45),out sname_out CHAR(45))
BEGINSELECT SNAMEINTO sname_outFROM SWHERE SNO = sno_in;
END $$
验证
CALL jsearch3('S1',@name);
SELECT @name;
(4) 创建一个使用游标的存储过程jsearch4,创建成功后调用该存储过程并验证结果。该存储过程的功能:当输入一个工程号JNO时,将返回供应该工程零件的所有供应商的名称(SNAME),这些供应商名拼接成一个字符串,并用逗号’,’分隔。
DELIMITER $$
CREATE PROCEDURE jsearch4(in jno_in CHAR(45))
BEGINDECLARE TEMP CHAR(100) DEFAULT '''';DECLARE NAME CHAR(10);DECLARE DONE INT DEFAULT 0;DECLARE C_NAME CURSOR FORSELECT DISTINCT S.SNAMEFROM S,SPJWHERE S.SNO = SPJ.SNOAND SPJ.JNO = jno_in;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;OPEN C_NAME;FETCH C_NAME INTO NAME;REPEATSET TEMP =CONCAT(TEMP,NAME);SET TEMP =CONCAT(TEMP,',');FETCH C_NAME INTO NAME;UNTIL DONEEND REPEAT;SET TEMP =CONCAT(TEMP,'''');CLOSE C_NAME;SELECT TEMP;
END $$
验证
CALL jsearch4('J2');
(5) 查看存储过程jsearch1和jsearch2的文本信息。(5分)
show create procedure jsearch1 \G;
show create procedure jsearch2 \G;
(6) 查看存储过程jsearch1基本状态信息。(5分)
show procedure status like 'jsearch1';
(7) 删除jsearch1存储过程。(5分)
DROP PROCEDURE jsearch1;
- 针对Student数据库,创建和执行如下的触发器:(共计40分)
(1) 删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。该触发器的功能:当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入C表中没有的数据”,并阻止该数据的插入;如果插入的sno值不是S表中的sno的已有值,则提示用户“不能插入S表中没有的数据”,并阻止该数据的插入。触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。(5分)
DELIMITER $$
CREATE TRIGGER insert_s BEFORE INSERT ON SC FOR EACH ROW
BEGINIF NEW.SNO NOT IN (SELECT DISTINCT(SNO) FROM S)THEN SIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = '不能插入S表没有的数据';END IF;IF NEW.CNO NOT IN (SELECT DISTINCT(CNO) FROM S)THEN SIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = '不能插入C表没有的数据';END IF;
END $$
验证
INSERT
INTO SC(ID,SNO,CNO)
VALUES(10000,'100001','5');INSERT
INTO SC(ID,SNO,CNO)
VALUES(10000,'100','7');
(2) 为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是提示用户“不能删除该表中的数据”并阻止用户删除S表中的数据。触发器创建成功之后,删除S表中记录,验证触发器是否正常工作。(5分)
DELIMITER $$
CREATE TRIGGER dele_s1 BEFORE DELETE ON S FOR EACH ROW
BEGINSIGNAL SQLSTATE '03100'SET MESSAGE_TEXT = '不能删除该表中的数据';
END $$
验证:
DELETE
FROM s
WHERE SNO = '10001';
(3) 为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作(确认S表和SC表相关数据是否被删除)。(5分)
DELIMITER $$
CREATE TRIGGER dele_s2 AFTER DELETE ON S FOR EACH ROW
BEGINSET @SNO = OLD.SNO;DELETE FROM SC WHERE SNO = @SNO;
END $$
验证:
DELETE
FROM S
WHERE SNO = '10001';
(4) 为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容(更新不成功,并且提示“不能更新sdept字段”)。触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。(5分)
DELIMITER $$
CREATE TRIGGER update_s BEFORE UPDATE ON S FOR EACH ROW
BEGINIF NEW.SDEPT != OLD.SDEPTTHEN SIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = '不能更新sdept字段';END IF;
END $$
验证:
UPDATE S
SET SDEPT = 'CS'
WHERE SNO = '1';
(5) 删除update_s触发器。(5分)
DROP TRIGGER update_s;
(6) 自己设计一个before update触发器和after update触发器,比较before 和after触发器的区别。(5分)
before触发器
DELIMITER $$
CREATE TRIGGER update_s_before BEFORE UPDATE ON S FOR EACH ROW
BEGINIF NEW.SDEPT = 'CS'THENSET NEW.SDEPT = 'IS';END IF;END $$
after触发器
DELIMITER $$
CREATE TRIGGER update_s_after after UPDATE ON S FOR EACH ROW
BEGINIF NEW.SDEPT = 'CS'THENSET NEW.SDEPT = 'IS';END IF;END $$
after触发器在事务执行之后生效,上述代码中将学生表的系修改为IS,对于一个已经执行了update操作的事务,再将其修改回来系统会报错。故这种情况下的after触发器不能被创建。
验证:
UPDATE S
SET SDEPT = 'CS'
WHERE SNO = '1';
(7) 创建一个新的课程成绩统计表 CAvgGrade(Cno, Snum, examSNum, avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。利用触发器实现如下的功能:当SC表中插入、删除或者更新某个人的成绩时,自动更新表CAvgGrade。注意SC表中的grade为NULL时表明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,计算平均成绩需要计算该学生成绩。(10分)
首先设计一个公共的存储过程,这个存储过程可供三个触发器调用,实现数据的插入CAvgGrade表中。
DELIMITER $$
CREATE PROCEDURE update_cavggrade(in in_cno INT)
BEGINDECLARE e_snum INT;DECLARE e_examsnum INT;DECLARE e_avggrade INT;SELECT COUNT(*) FROM sc WHERE cno = in_cnoINTO e_snum;SELECT count(*) FROM sc WHERE cno = in_cno AND grade is not nullINTO e_examsnum;SELECT AVG(grade) FROM sc WHERE cno = in_cno AND grade is not nullINTO e_avggrade;IF in_cno IN (SELECT DISTINCT cno FROM cavggrade)THEN UPDATE cavggrade SET Snum = e_snum,examSNum = e_examsnum,avgGrade = e_avggradeWHERE cno = in_cno;ELSE INSERT INTO cavggrade VALUES(in_cno,e_snum,e_examsnum,e_avggrade);end IF;
END$$
插入触发器:
DELIMITER $$
CREATE TRIGGER insert_sc AFTER INSERT ON SC FOR EACH ROW
BEGINcall update_cavggrade(new.cno);
END$$
更新触发器:
DELIMITER $$
CREATE TRIGGER update_sc AFTER UPDATE ON SC FOR EACH ROW
BEGINcall update_cavggrade(new.cno);call update_cavggrade(old.cno);
END$$
删除触发器
DELIMITER $$
CREATE TRIGGER delete_sc AFTER DELETE ON SC FOR EACH ROW
BEGINcall update_cavggrade(old.cno);
END$
- 创建一个员工表employee(eID, eName, salary),假设该表中有1000条员工数据,完成下列要求。(总计20分,每题10分)
(1) 为了协助本题自动生成1000条员工数据,创建一个自动生成员工ID的用户自定义函数generateEID。其中员工ID要求是一个8位的数字,前四位表示插入员工数据的当前年份,后四位按照从0001到9999的顺序增长。例如2015年插入的第一条数据是20150001,所有1000条员工ID分别是20150001-20151000。调用该函数实现自动插入1000条数据。(注意插入数据的时候员工姓名可以为任意值,工资是2000-5000之间的数字)
DELIMITER $$
CREATE PROCEDURE generateEID(in n int)
BEGINSET @x = 0;REPEAT SET @x = @x + 1;INSERT INTO employee VALUES(20210000 + @x,concat('ename',cast(@x as char(10))),floor(2000 + 3000*rand()));UNTIL @x >= nEND REPEAT;
END$$
执行
1. call generateEID(1000);
(2) 该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整。工资增长规则如下:
- 工资在3000元以下,每月涨300元;
- 工资在3000-4000元之间,每月涨200元;
- 工资大于或者等于4000元,每月涨50元;
DELIMITER $$CREATE PROCEDURE salary_increase ()BEGINDECLARE e_salary int;DECLARE e_eid int;DECLARE done int;DECLARE c_name cursor for SELECT eID,salary from employee;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN c_name;FETCH c_name INTO e_eid,e_salary; REPEATCASE WHEN e_salary < 3000THEN UPDATE employee SET salary = salary + 300 WHERE eid = e_eid;WHEN e_salary >= 3000 and e_salary < 4000THEN UPDATE employee SET salary = salary + 200 where eid = e_eid;ELSE UPDATE employee SET salary = salary + 50 where eid = e_eid;END CASE; FETCH c_name INTO e_eid,e_salary;UNTIL doneEND REPEAT; CLOSE c_name;
END$$
执行
call salary_increase();
数据库原理实验五——触发器与存储过程(函数)相关推荐
- MySQL数据库实验五 触发器和存储过程
★观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考,. 一.实验目的 1.掌握某主流DBMS支持的SQ ...
- mysql数据库原理实验报告_数据库原理实验报告(Mysql).doc
数据库原理实验报告(Mysql).doc 实验项目列表 序号实验项目名称指导教师1实验一 数据库的定义实验(验证性)2实验二 数据库的建立和维护实验(验证性)3实验三 数据库的查询实验(验证性)4实验 ...
- mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc
数据库原理实验报告s11-数据库触发器的创建.doc 数据库管理系统SQLSERVER实验报告第1页2011年5月4日实验11数据库触发器的建立实验日期和时间20141128实验室软件工程室班级12计 ...
- 《数据库原理实验指导书》
<数据库原理实验指导书> 河南科技大学软件学院 目录 实验规则 基本实验方法 实验环境 实验一 数据定义 实验二 数据更新 实验三 数据查询-简单查询和连接查询 实验四 数据查询-分组查询 ...
- 【数据库原理实验(openGauss)】实验报告
<数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...
- 数据库原理实验二 数据库管理 实验报告
广州大学学生实验报告实验二:数据库管理 此篇分享仅供参考学习,图文禁复制,勿作他用!谢谢配合! 数据库原理实验之实验二:数据库管理 软件:Oracle SQL Developer 今天实验才刚开始,花 ...
- 【数据库原理实验(openGauss)】金融场景化实验
金融场景化实验 文章目录 金融场景化实验 一.金融数据模型 1.E-R图 2.关系模式 3.物理模型 Client(客户)表 bank_card(银行卡)表 finances_product(理财产品 ...
- 数据库原理实验三 数据库综合设计实验 实验报告
实验三 数据库系统设计综合实验 1.实验目的通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统. 2.实验要求熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的 ...
- MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06
目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysq ...
最新文章
- 中国半导体材料市场投资潜力与发展动态研究报告2022版
- TensorFlow tf.data 导入数据(tf.data官方教程) * * * * *
- 【MyEclips】“Could not create the view: An unexpected exception was thrown”错误解决
- 【OO学习】OO第二单元作业总结
- jquery实现无限滚动瀑布流实现原理
- jsp员工管理系统mysql_基于JSP的企业员工信息管理系统的设计(MySQL)
- 支持所有浏览器的右键菜单
- 服装企业二维码应用现状,如何建立二维码营销平台规则体系?
- 今日头条推荐算法研究
- 数据结构与算法(一):时间复杂度和空间复杂度
- LLVM项目的目录布局介绍
- 你知道索引失效嘛?举例看看?
- [转贴]Debian的汉化步骤【转自http://www.linuxsir.org】
- 关于页面请求发起后,通过F12查看到,被挂起页面中stalled花费很长时间问题的追查...
- Lesson 18 Electric currents in modern art 内容鉴赏
- Coursera无法播放视频问题的解决
- python人机对话存在的问题_如何适应人机对话要点及情景问题
- 搭建(WSTMart)php电商环境时缺少fileinfo函数
- lEO数值资产系统新版本c2c币数值合约交易平台自动撮合松机器人功能
- 前端三剑客之HTML入门教程