实验目的

  1. 熟练掌握存储过程/函数的创建和执行方法。
  2. 熟练掌握触发器的创建和执行方法。

实验内容

  1. 针对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;
  1. 针对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$
  1. 创建一个员工表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();

数据库原理实验五——触发器与存储过程(函数)相关推荐

  1. MySQL数据库实验五 触发器和存储过程

    ★观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考,. 一.实验目的 1.掌握某主流DBMS支持的SQ ...

  2. mysql数据库原理实验报告_数据库原理实验报告(Mysql).doc

    数据库原理实验报告(Mysql).doc 实验项目列表 序号实验项目名称指导教师1实验一 数据库的定义实验(验证性)2实验二 数据库的建立和维护实验(验证性)3实验三 数据库的查询实验(验证性)4实验 ...

  3. mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc

    数据库原理实验报告s11-数据库触发器的创建.doc 数据库管理系统SQLSERVER实验报告第1页2011年5月4日实验11数据库触发器的建立实验日期和时间20141128实验室软件工程室班级12计 ...

  4. 《数据库原理实验指导书》

    <数据库原理实验指导书> 河南科技大学软件学院 目录 实验规则 基本实验方法 实验环境 实验一 数据定义 实验二 数据更新 实验三 数据查询-简单查询和连接查询 实验四 数据查询-分组查询 ...

  5. 【数据库原理实验(openGauss)】实验报告

    <数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...

  6. 数据库原理实验二 数据库管理 实验报告

    广州大学学生实验报告实验二:数据库管理 此篇分享仅供参考学习,图文禁复制,勿作他用!谢谢配合! 数据库原理实验之实验二:数据库管理 软件:Oracle SQL Developer 今天实验才刚开始,花 ...

  7. 【数据库原理实验(openGauss)】金融场景化实验

    金融场景化实验 文章目录 金融场景化实验 一.金融数据模型 1.E-R图 2.关系模式 3.物理模型 Client(客户)表 bank_card(银行卡)表 finances_product(理财产品 ...

  8. 数据库原理实验三 数据库综合设计实验 实验报告

    实验三 数据库系统设计综合实验 1.实验目的通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统. 2.实验要求熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的 ...

  9. MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

    目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysq ...

最新文章

  1. 中国半导体材料市场投资潜力与发展动态研究报告2022版
  2. TensorFlow tf.data 导入数据(tf.data官方教程) * * * * *
  3. 【MyEclips】“Could not create the view: An unexpected exception was thrown”错误解决
  4. 【OO学习】OO第二单元作业总结
  5. jquery实现无限滚动瀑布流实现原理
  6. jsp员工管理系统mysql_基于JSP的企业员工信息管理系统的设计(MySQL)
  7. 支持所有浏览器的右键菜单
  8. 服装企业二维码应用现状,如何建立二维码营销平台规则体系?
  9. 今日头条推荐算法研究
  10. 数据结构与算法(一):时间复杂度和空间复杂度
  11. LLVM项目的目录布局介绍
  12. 你知道索引失效嘛?举例看看?
  13. [转贴]Debian的汉化步骤【转自http://www.linuxsir.org】
  14. 关于页面请求发起后,通过F12查看到,被挂起页面中stalled花费很长时间问题的追查...
  15. Lesson 18 Electric currents in modern art 内容鉴赏
  16. Coursera无法播放视频问题的解决
  17. python人机对话存在的问题_如何适应人机对话要点及情景问题
  18. 搭建(WSTMart)php电商环境时缺少fileinfo函数
  19. lEO数值资产系统新版本c2c币数值合约交易平台自动撮合松机器人功能
  20. 前端三剑客之HTML入门教程

热门文章

  1. 服务器再次全球宕机 谷歌官方回应:内部技术故障所致
  2. 一加7是什么协议_关于一加8T的充电,看这篇就够了
  3. AI智能电话销售机器人源码搭建部署系统
  4. mysql 516,jsp516期刊学报网络投稿系统mysql
  5. c语言哈夫曼树统计字母频率,C语言实现哈夫曼树
  6. sil suffisait daimer
  7. python编写语法解析器_SLR语法分析器 python实现
  8. 2021年国内CRM软件排名参考
  9. 抖音网红大蓝称视频号永远都做不起来
  10. SIGGRAPH2005!!!