数据库的存储过程、函数与触发器

在这里插入图片描述

使用下面的场景来引入

1.创建表

CREATE DATABASE staff;
USE staff;
CREATE TABLE employee(
    id INT NOT NULL AUTO_INCREMENT,
    userName VARCHAR(255),
    birthDate DATE,
    idCard VARCHAR(255),
    loginName VARCHAR(255),
    PASSWORD VARCHAR(255),
    mobile VARCHAR(255),
    email VARCHAR(255),
    deptId INT,
    LEVEL INT,
    avatar BLOB,
    remark TEXT,
    PRIMARY KEY(id)
);

CREATE TABLE dept(
    id INT NOT NULL AUTO_INCREMENT,
    deptName VARCHAR(255),
    manageId INT,
    remark VARCHAR(255),
    PRIMARY KEY(id)
);

CREATE TABLE payroll(
    id INT NOT NULL AUTO_INCREMENT,
    empId INT,
    baseSalary DOUBLE,
    actualSalary DOUBLE,
    bonus DOUBLE,
    deductMoney DOUBLE,
    grantDate DATE,
    PRIMARY KEY(id)
);

CREATE TABLE ask_leave(
    id INT NOT NULL AUTO_INCREMENT,
    empId INT,
    leaveReason TEXT,
    beginDate DATE,
    endDate DATE,
    submitDate DATE,
    auditId INT,
    STATUS INT,
    auditOpinion TEXT,
    PRIMARY KEY(id)
);

2.编写存储过程实现插入员工表:参数为:

员工编号idint
姓名userNamevarchar(225)
出生日期birthDatedate
身份证号idCardvarchar(225)
登录名称loginNamevarchar(225)
登录密码passwordvarchar(225)
手机号mobilevarchar(225)
电子邮件emailvarchar(225)
部门编号deptIdint
员工级别levelint
员工头像avatarblob
备注remarktext

存储过程名称为:insert_employee

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_employee`(
	IN `id` int,
	IN `username` varchar(225),
	IN `birthDate` date,
	IN `idCard` varchar(225),
	IN `loginName` varchar(225),
	IN `password` varchar(225),
	IN `mobile` varchar(225),
	IN `email` varchar(225),
	IN `deptId` int,
	IN `level` int,
	IN `avatar` blob,
	IN `remark` text
)
BEGIN
	DECLARE cnt INT;
	SELECT COUNT(*) INTO cnt FROM employee WHERE employee.id = id;
	IF cnt = 0 THEN 
		INSERT INTO employee(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark` )
    VALUES(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark`);
	END IF;
END

3.利用存储过程在员工表中插入记录.

call insert_employee(1,'小红','2002-03-14','411423200203141510','xiaohong','123','15238790678','1625376859@qq.com',3,1,NULL,'新员工');
call insert_employee(2,'小橙','2002-02-14','411423200203241511','xiaocheng','123','15238790677','1625376858@qq.com',2,2,NULL,'新员工');

4.创建触发器。
插入

CREATE TRIGGER `insert_payroll` BEFORE 
INSERT ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

更新

CREATE DEFINER = `root`@`localhost`
TRIGGER `update_payroll` BEFORE 
UPDATE ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

5.在员工表中依据姓名userName建立索引。

CREATE INDEX index_userName 
ON employee(username);

6.建立员工部门工资视图(包含员工名称,部门名称,基本工资,应发工资,奖金,缺勤扣钱)

CREATE VIEW v_employee_dept_payroll AS
SELECT username AS 姓名,deptName AS 部门名称,baseSalary AS 基本工资,actualSalary AS 应发工资,bonus AS 奖金,deductMoney AS 缺勤扣钱
FROM employee,dept,payroll
WHERE employee.id = payroll.empId AND employee.deptId = dept.id;

7.利用触发器实现插入请假信息时,审核人编号自动填入请假人所在部门的部门经理编号。

CREATE DEFINER = `root`@`localhost` 
TRIGGER `insert_ask_leave` BEFORE 
INSERT ON `ask_leave` 
FOR EACH ROW SET new.auditId = (
SELECT manageId 
FROM employee,dept 
WHERE employee.deptid = dept.id AND new.empid = employee.id
);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求? urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

C++:编程世界的永恒之石

在编程的广袤领域中,C犹如一块永恒的基石,历经岁月的洗礼,依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域,使其成为无数程序员心中的信仰与追求。 一、C:历史与传承的交汇点 C的历史可追溯到上世纪80年代&…

Spring自定义配置属性类

以一个minio的配置类为例 首先,由于minio模块被很多微服务需要,因此封装了一个starter,当背的微服务需要的时候就进行引入。 以下是starter模块的结构图 一、spring.factories文件 org.springframework.boot.autoconfigure.EnableAutoConf…

2.1.2 事件驱动reactor的原理与实现

LINUX 精通 2 day14 20240513 day15 20240514 算法刷题:2维前缀和,一二维差分 耗时 135min 习题课 4h 课程补20240425 耗时:4h 课程链接地址 回顾 怎么学0voice课网络io——一请求一线程,一个client一个连接再accpet分配io f…

每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)

437. 路径总和 III - 力扣(LeetCode) 前序遍历时,维护当前路径(根节点开始)的路径和,同时记录路径上每个节点的路径和 假设当前路径和为cur,那么ans 路径和(cur - target)的出现次数 /*** D…

C语言:指针(3)

1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 本质是把字符串 hello bit. ⾸字符的地址放到了pstr中。上⾯代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 2. 数组指针变量 2.1 数组指针变量是什么? 答案…

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过,岁月如梭,再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量,更是一次意志的考验。在这最后的冲刺阶段,每一刻都显…

注意力机制篇 | YOLOv8改进之在C2f模块引入反向残差注意力模块iRMB | CVPR 2023

前言:Hello大家好,我是小哥谈。反向残差注意力模块iRMB是一种用于图像分类和目标检测的深度学习模块。它结合了反向残差和注意力机制的优点,能够有效地提高模型的性能。在iRMB中,反向残差指的是将原始的残差块进行反转,即将卷积操作和批量归一化操作放在了后面。这样做的好…

第 5 篇 : 多节点Netty服务端(可扩展)

说明 前面消息互发以及广播都是单机就可以完成测试, 但实际场景中客户端的连接数量很大, 那就需要有一定数量的服务端去支撑, 所以准备虚拟机测试。 1. 虚拟机准备 1.1 准备1个1核1G的虚拟机(160), 配置java环境, 安装redis和minio 1.2 准备6个1核1G的空虚拟机(161到166), …

【opencv】图像拼接实验

实验环境:anaconda、jupyter notebook 实验用到的包:opencv、matplotlib、numpy 注:opencv在3.4.2之后sift就不是免费的了 我用的是3.4.1.15版本 实验使用到的图片 一、sift函数获取特征值 读入图片 book cv2.imread(book.png, cv2.IMRE…

Winform(c#)如何上传图片等资源文件

1、首先找到工程中properties,如下图双击其中的Resources.resx文件 2、进入下面界面,点击“添加资源”,选择要添加的图片资源 3、然后我们就可以使用了

OSPF工作过程

1.OSPF的数据包 hello包——周期性的发现,建立以及保活邻居关系 hello时间 --- 10S 死亡时间 --- 4倍的hello时间 --- 40S RID --- 1,全网唯一;2,格式统一---- 格式要求和IP地址一样,由32位二进制构成,使用点分十进制…

JavaEE 初阶篇-深入了解网络原理 TCP/IP 协议

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 TCP 协议概述 1.1 TCP 协议格式 2.0 TCP 协议的特性 2.1 确认应答 2.2 超时重传 2.2.1 超时的时间如何确定? 2.3 连接管理 2.3.1 三次握手 2.3.2 四次…

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数?2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

DGC-GNN 配置运行

算法 DGC-GNN,这是一种全局到局部的图神经网络,用于提高图像中2D关键点与场景的稀疏3D点云的匹配精度。与依赖视觉描述符的方法相比,这种方法具有较低的内存需求,更好的隐私保护,并减少了对昂贵3D模型维护的需求。DGC-…

树莓派发送指令控制FPGA板子上的流水灯程序

文章目录 前言一、树莓派简介二、整体实现步骤三、树莓派设置四、树莓派串口代码五、Verilog代码5.1 串口接收模块5.2 流水灯模块 六、quartus引脚绑定七、 运行效果总结参考 前言 ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信,控制FPGA开发板上的小灯。实验…

LBSS84LT1G 130MA 50V P沟道小电流MOS管

LBSS84LT1G作为一款P沟道功率MOSFET,由于其低导通电阻和快速切换特性,在电机控制中有着广泛的应用。以下是几个典型的应用案例: 1. 直流电机驱动:在直流电机驱动电路中,LBSS84LT1G可用于控制电机的转速和方向。通过控…

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接,允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据,实现了实时的双向通信。 这部分直接说你可能听不懂;我…

nestJs中跨库查询

app.module.ts中配置 模块的module中 注意实体类在写的时候和数据库中的表名一样 service中使用一下

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐:Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…