【数据库——MySQL】(16)游标和触发器习题及讲解

目录

  • 1. 题目
    • 1.1 游标
    • 1.2 触发器
  • 2. 解答
    • 2.1 游标
    • 2.2 触发器

1. 题目

1.1 游标

  1. 创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)

  2. 创建存储过程,将某部门的员工工资按工作年限进行调整,工作年限<3,提高 %53<=工作年限<5,提高 %10工作年限>=5,提高 %15

1.2 触发器

  1. 创建触发器,当在 employees 表中插入一个员工信息时,如果员工的部门编号,department 表中没有,则取消插入操作。

  2. 创建触发器,当在 employees 表中删除一条记录时,在 salary 表中删掉该员工的记录。

  3. 创建触发器,当在 employees 表中修改员工编号时,在 salary 表中同时修改员工编号。

2. 解答

2.1 游标

  1. 创建存储过程,利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现)

    方法一:使用计数器来循环

    drop PROCEDURE if EXISTS p1;
    delimiter $
    create PROCEDURE p1(in dname char(20))
    begindeclare employee_id char(6);declare employee_name char(10);declare employee_salary float;declare salary_count int;		# 统计记录数declare i int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;select count(*) into salary_countfrom (select employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname)a;open c_salary;    # 打开游标while i <= salary_count doFETCH c_salary into employee_id, employee_name, employee_salary;		# 读取游标select employee_id, employee_name, employee_salary;		# 使用游标set i = i + 1;end while;close c_salary;		# 关闭游标end $
    delimiter ;call p1('广告部');
    

    在这里插入图片描述

    方法二:使用控制循环

    drop PROCEDURE if EXISTS p1;
    delimiter $
    create PROCEDURE p1(in dname char(20))
    begindeclare employee_id char(6);declare employee_name char(10);declare employee_salary float;declare f int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.`Name`, salary.Income - salary.Outcome as '实际收入'from employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;# 错误处理declare exit handler for not foundset f = 0;open c_salary;    # 打开游标while f = 1 doFETCH c_salary into employee_id, employee_name, employee_salary;		# 读取游标select employee_id, employee_name, employee_salary;		# 使用游标end while;close c_salary;		# 关闭游标end $
    delimiter ;call p1('广告部');
    

    在这里插入图片描述

  2. 创建存储过程,将某部门的员工工资按工作年限进行调整,工作年限<3,提高 %53<=工作年限<5,提高 %10工作年限>=5,提高 %15

    drop PROCEDURE if EXISTS p2;
    delimiter $
    create PROCEDURE p2(in dname char(20))
    begindeclare employee_id char(6);declare employee_WorkYear TINYINT;declare add_income float;declare f int default 1;# 设置游标declare c_salary CURSOR forselect employees.EmployeeID, employees.WorkYearfrom employees join departments on employees.DepartmentID = departments.DepartmentIDjoin salary on employees.EmployeeID = salary.EmployeeIDwhere departments.DepartmentName = dname;# 错误处理declare exit handler for not foundset f = 0;open c_salary;    # 打开游标while f = 1 doFETCH c_salary into employee_id, employee_WorkYear;		# 读取游标if employee_WorkYear < 3 then set add_income = 0.05;elseif employee_WorkYear < 5 thenset add_income = 0.1;elseset add_income = 0.15;end if;update salaryset Income = Income + Income * add_incomewhere salary.EmployeeID = employee_id;end while;close c_salary;		# 关闭游标end $
    delimiter ;call p2('广告部');
    

    在这里插入图片描述

    再次调用存储过程 p1 查看广告部员工实际收入,从而验证存储过程 p2 是否正确。

    :因为在存储过程 p2 提高的是 收入,而不是 实际收入,即支出是不变的。所以 p2 的结果不是简单的通过 p1 的结果乘上相应提升率!

    在这里插入图片描述

    比如 伍容华 的支出是 88.03,那么存储过程 p2 的结果是这么来的:

    ( 1494.59 + 88.03 ) ∗ ( 1 + 0.1 ) = 1740.882 (1494.59+88.03) * (1+0.1) = 1740.882 (1494.59+88.03)(1+0.1)=1740.882
    1740.88 − 88.03 = 1652.85 1740.88 - 88.03 = 1652.85 1740.8888.03=1652.85

2.2 触发器

  1. 创建触发器,当在 employees 表中插入一个员工信息时,如果员工的部门编号,department 表中没有,则取消插入操作。

    drop trigger if EXISTS tri_insertinfo;
    delimiter $
    create TRIGGER tri_insertinfo before insert on employees for each row
    begindeclare a int;select count(*) into afrom departmentswhere departments.DepartmentID = new.DepartmentID;if a = 0 then SIGNAL SQLSTATE '12345' set message_text = '部门不存在';end if;end$
    delimiter ;select * from employees;
    

    在这里插入图片描述

    select * from departments;
    

    在这里插入图片描述

    insert into employees values('999996', '小邓在森林', '本科', '2022-02-17', '1', 5, '武汉大学', '00000000', '6');
    

    在这里插入图片描述

    insert into employees values('999995', '小邓在森林', '本科', '2022-02-17', '1', 5, '武汉大学', '00000000', '10');
    

    在这里插入图片描述

    select * from employees;
    

    在这里插入图片描述

  2. 创建触发器,当在 employees 表中删除一条记录时,在 salary 表中删掉该员工的记录。

    drop trigger if EXISTS tri_deleteinfo;
    delimiter $
    create TRIGGER tri_deleteinfo after delete on employees for each row
    begindelete from salarywhere EmployeeID=old.EmployeeID;end$
    delimiter ;
    
    delete from employees where EmployeeID = 999996;
    select * from employees;
    select * from salary;
    

    在这里插入图片描述

    :因为没有在表 salary 中插入 小邓在森林 的数据,我们再来试一下删除 伍容华 的数据。

    delete from employees where EmployeeID = 010008;
    select * from employees;
    select * from salary;
    

    在这里插入图片描述
    可以看见 伍容华 的数据已经被删除。

  3. 创建触发器,当在 employees 表中修改员工编号时,在 salary 表中同时修改员工编号。

    drop trigger if EXISTS tri_updateinfo;
    delimiter $
    create TRIGGER tri_updateinfo after update on employees for each row
    beginupdate salaryset EmployeeID = new.EmployeeIDwhere EmployeeID = old.EmployeeID;
    end$
    delimiter ;
    

    我们修改 王林 的编号(将 000001 修改为 999999),原数据是:

    select * from employees;
    select * from salary;
    

    在这里插入图片描述

    修改后结果:

    update employeesset EmployeeID = '999999'where employees.EmployeeID = '000001';select * from employees;
    select * from salary;
    

    在这里插入图片描述

上一篇文章:【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解
下一篇文章:【数据库——MySQL(实战项目1)】(1)图书借阅系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端js调试如何复制console.log打印的对象或数组

在使用console.log()打印我们的内容时&#xff0c;时常需要将打印的内容复制粘贴使用&#xff0c;然而控制台打印出来的对象是经过格式化处理且直接选择粘贴会有格式问题&#xff0c;此时我们可以通过控制台的 copy() 方法来进行打印结果的复制&#xff0c;如图所示&#xff1a…

使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件

文件夹目录如下&#xff08;需要递归删除文件夹下的.DS_Store文件&#xff09;&#xff1a; labels文件夹下面是xml文件&#xff1a; import os import os.pathpath "name/labels" files os.listdir(path) # 得到文件夹下所有文件名称 s []for xmlFile in files:…

JAVA String 和 String[][]互转的两种方法

第一种方法&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.40</version> </dependency>字符串转数组&#xff1a; String s "[[22,23,23],[1,10,20]]"…

华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

【轻松玩转MacOS】指引篇:这9篇指南助你轻松上手

引言 亲爱的读者&#xff0c;欢迎来到《轻松玩转MacOS》&#xff01;这里是专为MacOS新手打造的使用教学专栏&#xff0c;无论您是从Windows转投Mac的初学者&#xff0c;还是对MacOS操作略知一二但希望更进一步的朋友&#xff0c;都能在这里找到您需要的答案。 正文 1、基本…

Java8实战-总结40

Java8实战-总结40 用Optional取代null如何为缺失的值建模采用防御式检查减少 NullPointerExceptionnull 带来的种种问题其他语言中 null 的替代品 用Optional取代null 如何为缺失的值建模 假设需要处理下面这样的嵌套对象&#xff0c;这是一个拥有汽车及汽车保险的客户。 pub…

QT作业二

1、思维导图 https://www.zhixi.com/view/9e899ee0 2、作业 #include <iostream>using namespace std;class Rect {int width;int height; public:void init(int w,int h);//初始化函数void set_w(int w);//更改宽度void set_h(int h);//更改高度void show();//输出矩形…

php 外贸代购系统网站

PHP 外贸代购系统网站建设需要以下步骤&#xff1a; 链接各大热门商城上的商品并自动获取参数&#xff0c;程序集成了淘宝、拍拍等大型热门商城抓取规则&#xff0c;可以直接一键代购上面的任何商品&#xff0c;自动获取相应的参数。 确定网站功能&#xff0c;如&#xff1a;产…

你真的懂Java的继承吗?你知道什么时候用继承吗?设计继承是为了什么?

目录 1. 封装的意义是什么&#xff1f; 2. 为什么需要继承&#xff1f; 3. 继承是什么&#xff1f;如何使用&#xff1f; 4. 继承的好处是什么&#xff1f; 5. 设计继承需要注意什么&#xff1f; 6. 继承的特点 7. 子类到底继承了父类的哪些内容 7.1 继承内容 7.2 虚方…

【WSN】模拟无线传感器网络研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java设计模式之装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不改变对象结构的情况下&#xff0c;动态地将新功能附加到对象上。装饰器模式通过创建一个包装对象来实现这一目的&#xff0c;该包装对象包含了原始对象&#xff0c;并在其上添…

html 笔记:CSS

1 什么是CSS CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素样式通常存储在样式表中 1.1 css的语法格式 1.1.1 选择器种类 HTML选择器&#xff1a; 重新定义HTML的某种标签的显示格式id选择器 对于HTML文档中的某个标签&#xff0c;定义它的显示格式…

JavaScript进阶(二十三):立即执行函数(匿名函数)( ( ) { } ( ) )含义解析

文章目录 一、前言二、立即执行函数2.1 立即执行函数使用的场景 三、拓展阅读 一、前言 前端项目改造过程中&#xff0c;引入的工具类实现如下&#xff1a; var tensquared(function(x) {return x*x; }(10)); 拆解以上语句如下&#xff1a; var tensquared xx; 这是赋值语句…

HTML5+CSS3+移动web 前端开发入门笔记(二)HTML标签详解

HTML标签&#xff1a;排版标签 排版标签用于对网页内容进行布局和样式的调整。下面是对常见排版标签的详细介绍&#xff1a; <h1>: 定义一级标题&#xff0c;通常用于标题栏或页面主要内容的标题。<p>: 定义段落&#xff0c;用于将文字分段展示&#xff0c;段落之…

Jmeter 链接MySQL测试

1.环境部署 1.1官网下载MySQL Connector https://dev.mysql.com/downloads/connector/j/ 1.2 解压后&#xff0c;将jar放到jmeter/lib目录下 1.3 在测试计划中添加引用 2.脚本设置 2.1设置JDBC Connection Configuration 先添加一个setUp线程中&#xff0c;在setUp中添加“…

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba

前言&#xff1a;当时比赛没有做出来现在来复现一下 就当记录一下&#xff08;这个思路没想到&#xff09; Black Mamba&#xff1a; 一张图片 常规得分离&#xff0c;属性&#xff0c;LSB&#xff0c;盲水印等都尝试过 无果&#xff01; 考点&#xff1a;异或解密&#xff0…

计算机算法分析与设计(8)---图像压缩动态规划算法(含C++代码)

文章目录 一、知识概述1.1 问题描述1.2 算法思想1.3 算法设计1.4 例题分析 二、代码 一、知识概述 1.1 问题描述 1. 一幅图像的由很多个像素点构成&#xff0c;像素点越多分辨率越高&#xff0c;像素的灰度值范围为0~255&#xff0c;也就是需要8bit来存储一个像素的灰度值信息…

C# 为什么要限制静态方法的使用

前言 在工作了一年多之后&#xff0c;我发现静态方法的耦合问题实在是头疼。如果可以尽量不要使用静态方法存储数据&#xff0c;如果要存储全局数据就把数据放在最顶层的主函数里面。 静态方法问题 耦合问题&#xff0c;不要用静态方法存储数据 我这里有两个静态方法&#…

已知文档被分成几个区块,一些行被改动,现在要求把有改动的区块找出来应该怎么做

要找出文档中被修改的区块&#xff0c;您可以使用文本比对&#xff08;text diff&#xff09;算法来比较原始文档和修改后的文档&#xff0c;并找到差异。这可以通过编程来完成&#xff0c;以下是一些常见的步骤&#xff1a; 将文档分成区块&#xff1a; 首先&#xff0c;您需要…

Java线程的基本操作(设置和获取、sleep、interrupt、join、yield、daemon、线程状态总结)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…