【数据库——MySQL】(14)过程式对象程序设计——游标、触发器
目录
- 1. 游标
- 1.1 声明游标
- 1.2 打开游标
- 1.3 读取游标
- 1.4 关闭游标
- 1.5 游标示例
- 2. 触发器
- 2.1 创建触发器
- 2.2 修改触发器
- 2.3 删除触发器
- 2.4 触发器类型
- 2.5 触发器示例
- 参考书籍
1. 游标
游标一般和存储过程一起配合使用。
1.1 声明游标
要使用游标,需要用到 DECLARE CURSOR
语句:
DECLARE 游标名 CURSOR FOR SELECT语句
注:一个存储过程可以声明多个游标,但是一个块中的每一个游标必须具有唯一的名字。
1.2 打开游标
要使用游标,需要用到 OPEN
语句:
OPEN 游标名;
1.3 读取游标
要使用游标,需要用到 FETCH...INTO
语句:
FETCH 游标名 INTO 变量名, ...
1.4 关闭游标
要使用游标,需要用到 CLOSE
语句:
CLOSE 游标名;
注:游标使用完以后要 及时关闭!
1.5 游标示例
【例】在数据库 score
中查询某个学院某门课程的成绩(方法一)
drop PROCEDURE if EXISTS p1;
delimiter $
create PROCEDURE p1(in did char(10), in lid char(10))
begindeclare stu_id char(15);declare lname char(20);declare stu_score int;declare score_count int; # 统计记录数declare i int default 1;# 设置游标declare c_score CURSOR forselect stu.id, lesson.lessonName, score.scorefrom stu join score on stu.id = score.stuIdjoin lesson on score.LessonId = lesson.lessonidjoin department on stu.departmentId = department.idwhere stu.departmentId = did and score.LessonId = lid;select count(*) into score_countfrom (select stu.id, lesson.lessonName, score.scorefrom stu join score on stu.id = score.stuIdjoin lesson on score.LessonId = lesson.lessonidjoin department on stu.departmentId = department.idwhere stu.departmentId = did and score.LessonId = lid)a;open c_score; # 打开游标while i <= score_count doFETCH c_score into stu_id, lname, stu_score; # 读取游标select stu_id, lname, stu_score; # 使用游标set i = i + 1;end while;close c_score; # 关闭游标end $
delimiter ;# 一般在命令列界面运行可以明显看出所要查看的数据
call p1('101', '101');
如果是在可视化界面运行 call p1('101', '101');
,效果如下(不方便查看,数据是一条条输出的):
在命令列界面运行 call p1('101', '101');
,方便查看:
我们也尝试不用存储过程直接输出结果,发现结果是一样的(除了输出顺序不同):
select stu.id, lesson.lessonName, score.scorefrom stu join score on stu.id = score.stuIdjoin lesson on score.LessonId = lesson.lessonidjoin department on stu.departmentId = department.idwhere stu.departmentId = '101' and score.LessonId = '101';
2. 触发器
2.1 创建触发器
用代码创建:
CREATE TRIGGER 触发器名 触发时刻 触发事件ON 表名 FOR EACH ROW 触发器动作
不过为了方便,我们可以直接使用可视化界面创建触发器。
2.2 修改触发器
建议直接在 Navicat
上进行创建、修改、删除触发器,在设计表中点击触发器即可。
2.3 删除触发器
前面说了可以直接使用 Navicat
删除触发器。
下面也给出相关代码:
DROP TRIGGER [数据库名.]触发器名
2.4 触发器类型
触发器只有 3
种类型:插入、更新 和 删除。每种类型又有 2
种情况:BEFORE 和 AFTER。
每个类型每种情况的触发器在一张表只能设置 1
个,即一张表最多只有 6
个触发器。
对于 事件、全局锁、表锁、行锁和死锁 的内容在此不过多赘述,大家要是感兴趣可以自行了解~
2.5 触发器示例
使用 bank
数据库,创建表 info
,利用触发器完成以下内容。下面会给出如何用 SQL
语句创建触发器并完成相应功能。
表 info
的内容如下:
-
插入存取款记录(触发器
tri_insertinfo
)——需要判断用户账号是否存在。drop trigger if EXISTS tri_insertinfo; delimiter $ create TRIGGER tri_insertinfo before insert on info for each row begindeclare a int;select count(*) into afrom accountwhere account.id = new.accountid;if a = 0 then SIGNAL SQLSTATE '12345' set message_text = '账号不存在';end if;if new.type = 'save' thenupdate accountset ck = ck + new.balancewhere account.id = new.accountid;elseupdate accountset ck = ck - new.balancewhere account.id = new.accountid;end if;end$ delimiter ;
查看当前所有用户存款:
select * from account;
给张三存入
500
元,并查看当前全部用户存款:insert into info values(null, '001', 'save', 500); select * from account;
李四取出
500
元:insert into info values(null, '002', 'load', 500); select * from account;
给用户编号为
005
(不存在用户)存入500
元:insert into info values(null, '005', 'save', 500); # 会显示账号不存在
-
创建触发器
tri_deleteinfo
撤销存取款记录(info
中的记录)。drop trigger if EXISTS tri_deleteinfo; delimiter $ create TRIGGER tri_deleteinfo after delete on info for each row beginif old.type = 'save' thenupdate accountset ck = ck - old.balancewhere account.id = old.accountid;elseupdate accountset ck = ck + old.balancewhere account.id = old.accountid;end if;end$ delimiter ;
撤销编号为
16
的取款操作:delete from info where id = 16; # 撤销id为16的操作 select * from account;
可见李四的账户从5550
恢复到上次的6050
。清除所有的存取款操作:
delete from info; # 撤销所有存取款操作,金额恢复 select * from account;
可见张三的账户金额出现了负数,这其实是异常结果,所以大家可以自行在源代码里面新增报告异常的语句。按照道理来说不会出现这种情况,可能是我之前操作数据时改变了记录~
-
创建触发器
tri_updateinfo
,用于修改用户存取款金额数。drop trigger if EXISTS tri_updateinfo; delimiter $ create TRIGGER tri_updateinfo after update on info for each row beginif old.type = 'save' thenupdate accountset ck = ck - old.balance + new.balancewhere account.id = old.accountid;elseupdate accountset ck = ck + old.balance - new.balancewhere account.id = old.accountid;end if;end$ delimiter ;
其实这个操作基本上用不上,毕竟用户存、取多少就是多少,而且这个操作可以用前面两个触发器实现,因此这里不展示修改操作了~
参考书籍
《MySQL实用教程(第4版)》
上一篇文章:【数据库——MySQL】(13)过程式对象程序设计——存储函数、错误处理以及事务管理
相关文章:
【数据库——MySQL】(14)过程式对象程序设计——游标、触发器
目录 1. 游标1.1 声明游标1.2 打开游标1.3 读取游标1.4 关闭游标1.5 游标示例 2. 触发器2.1 创建触发器2.2 修改触发器2.3 删除触发器2.4 触发器类型2.5 触发器示例 参考书籍 1. 游标 游标一般和存储过程一起配合使用。 1.1 声明游标 要使用游标,需要用到 DECLAR…...
位移贴图和法线贴图的区别
位移贴图和法线贴图都是用于增强模型表面细节和真实感的纹理贴图技术,但是它们之间也存在着差异。 1、什么是位移贴图 位移贴图:位移贴图通过在模型顶点上定义位移值来改变模型表面的形状。该贴图包含了每个像素的高度值信息,使得模型的细节…...
【typescript】面向对象(下篇),包含接口,属性的封装,泛型
假期第八篇,对于基础的知识点,我感觉自己还是很薄弱的。 趁着假期,再去复习一遍 面向对象:程序中所有的操作都需要通过对象来完成 计算机程序的本质就是对现实事物的抽象,抽象的反义词是具体。比如照片是对一个具体的…...
基于SpringBoot的视频网站系统
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 视频分享管理 视频排名管理 交流论坛管理 留言板管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运…...
23.3 Bootstrap 框架4
1. 轮播 1.1 轮播样式 在Bootstrap 5中, 创建轮播(Carousel)的相关类名及其介绍: * 1. carousel: 轮播容器的类名, 用于标识一个轮播组件. * 2. slide: 切换图片的过渡和动画效果. * 3. carousel-inner: 轮播项容器的类名, 用于包含轮播项(轮播图底下椭圆点, 轮播的过程可以显…...
ESP32设备驱动-I2C-LCD1602显示屏驱动
I2C-LCD1602显示屏驱动 1、LCD1602介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式…...
vs工具箱在哪里找
VS工具箱在标题栏 视图->工具箱...
uniapp 事件委托失败 获取不到dataset
问题: v-for 多个span ,绑定点击事件 代码:view里包着一个span, <view class"status-list" tap"search"><span class"status-item" v-for"(key,index) in statusList" :key"index" :data-key"k…...
windows系统下pycharm配置anaconda
参考:超详细的PycharmAnconda安装配置教程_pycharm conda_罅隙的博客-CSDN博客 下载好anaconda安装后,比如我们安装在D盘anaconda文件夹下,在pycharm配置好环境激活时出现问题,可能是电脑没有配置环境变量 需要将一下4行添加到电…...
2023年CSP-J真题详解+分析数据
目录 亲身体验 江苏卷 选择题 阅读程序题 阅读程序(1) 判断题 单选题 阅读程序(2) 判断题 单选题 阅读程序(3) 判断题 单选题 完善程序题 完善程序(1) 完善程序(2) 2023CSP-J江苏卷详解 小结 亲身体验 2023年的CSP-J是在9月16日9:30--11:30进行…...
10.3 调试事件转存进程内存
我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数…...
深度学习实战基础案例——卷积神经网络(CNN)基于MobileNetV3的肺炎识别|第3例
文章目录 前言一、数据集介绍二、前期工作三、数据集读取四、构建CA注意力模块五、构建模型六、开始训练 前言 Google公司继MobileNetV2之后,在2019年发表了它的改进版本MobileNetV3。而MobileNetV3共有两个版本,分别是MobileNetV3-Large和MobileNetV2-…...
机器学习 面试/笔试题(更新中)
1. 生成模型 VS 判别模型 生成模型: 由数据学得联合概率分布函数 P ( X , Y ) P(X,Y) P(X,Y),求出条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X)的预测模型。 朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机…...
【算法题】100019. 将数组分割成最多数目的子数组
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个只包含 非负 整数的数组 n…...
commons-io工具类常用方法
commons-io是Apache Commons项目的一个模块,提供了一系列处理I/O(输入/输出)操作的工具类和方法。它旨在简化Java I/O编程,并提供更多的功能和便利性。 读取文件内容为字符串 String path"C:\\Users\\zhang\\Desktop\\myyii\…...
【Typescript】面向对象(上篇),包含类,构造函数,继承,super,抽象类
假期第七篇,对于基础的知识点,我感觉自己还是很薄弱的。 趁着假期,再去复习一遍 面向对象:程序中所有的操作都需要通过对象来完成 计算机程序的本质就是对现实事物的抽象,抽象的反义词是具体。比如照片是对一个具体的…...
【python】python中字典的用法记录
文章目录 序言1. 字典的创建和访问2. 字典如何添加元素3. 字典作为函数参数4. 字典排序 序言 总结字典的一些常见用法 1. 字典的创建和访问 字典是一种可变容器类型,可以存储任意类型对象 key : value,其中value可以是任何数据类型,key必须…...
基于Java的大学生心理咨询系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
Redis-双写一致性
双写一致性 双写一致性解决方案延迟双删(有脏数据的风险)分布式锁(强一致性,性能比较低)异步通知(保证数据的最终一致性,高并发情况下会出现短暂的不一致情况) 双写一致性 当修改了数…...
CustomTkinter:创建现代、可定制的Python UI
文章目录 介绍安装设置外观与主题外观模式主题设置自定义主题颜色窗口缩放CTkFont字体设置CTkImage图片Widgets窗口部件CTk Windows窗口CTk窗口CTkInputDialog对话框CTkToplevel顶级窗口布局pack布局palce布局Grid 网格布局Frames 框架Frames滚动框架...
华为OD机试真题【不含 101 的数】
1、题目描述 【不含 101 的数】 【题目描述】 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个不含 101 的数&#…...
Spring IoC和DI详解
IOC思想 IoC( Inversion of Control,控制反转) 不是一门具体技术,而是一种设计思想, 是一种软件设计原则,它将应用程序的控制权(Bean的创建和依赖关系)从应用程序代码中解耦出来&am…...
mysql-binlog
1. 常用的binlog日志操作命令 1. 查看bin-log是否开启 show variables like log_%;2. 查看所有binlog日志列表 show master logs;3.查看master状态 show master status;4. 重置(清空)所有binlog日志 reset master;2. 查看binlog日志内容 1、使用mysqlb…...
通过BeanFactotyPostProcessor动态修改@FeignClient的path
最近项目有个需求,要在启动后,动态修改FeignClient的请求路径,网上找到的基本都是在FeignClient里使用${…},通过配置文件来定义Feign的接口路径,这并不能满足我们的需求 由于某些特殊原因,我们的每个接口…...
数据结构与算法系列-二分查找
二分查找 什么是二分查找? 二分查找是一种针对有序集合,每次将要查找的区间缩小一半,直到找到查找元素,或区间被缩小为0。 如何实现二分查找? 实现有3个注意点: 终止条件是 low < high 2.求中点的算…...
CSS 毛玻璃特效运用目录
主要是记录毛玻璃相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址Glassmorphism 登录表单完成一般文章链接代码下载Glassmorphism 按钮悬停效果完成一般文章链接代码下载Glassmorphism 计算器完成一般文章链接代码下载Glassmorphism 卡片悬停效果…...
如何在Qt6中引入Network模块
2023年10月1日,周日凌晨 2023年10月2日,周一下午 第一次更新 目录 如果用的是CMakeQt Console ApplicationQt Widgets Application如果用的是qmake 如果用的是CMake find_package(Qt6 COMPONENTS Network REQUIRED) target_link_libraries(mytarget…...
2023/10/4 QT实现TCP服务器客户端搭建
服务器端: 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { cla…...
云原生边缘计算KubeEdge安装配置
1. K8S集群部署,可以参考如下博客 请安装k8s集群,centos安装k8s集群 请安装k8s集群,ubuntu安装k8s集群 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -n kube-system #修改kube-proxy#大约在40多行…...
【LeetCode热题100】--35.搜索插入位置
35.搜索插入位置 使用二分查找: class Solution {public int searchInsert(int[] nums, int target) {int low 0,high nums.length -1;while(low < high){//注意每次循环完都要计算midint mid (low high)/2;if(nums[mid] target){return mid;}if(nums[mid]…...
wordpress 怎么学/北京千锋教育培训机构怎么样
前些天看见一个demo,扫描特定的形状,屏幕上会出现对应的小娃娃做相应的动作(3d的,不管你屏幕怎么动,他都是在固定的位置)。 这就引起了我的好奇心,查了半天,最后找到了一个…...
红旗h5/优化关键词哪家好
为什么80%的码农都做不了架构师?>>> 快递小件化学品,有化学安全资质邮递公司不愿意邮寄."氟乙酸甲酯"泄露。收寄验视制度难以落实。 http://news.cntv.cn/2014/01/12/VIDE1389457259085923.shtml 转载于:https://my.oschina.net/n…...
淘宝网官网首页/百度快速优化推广
【导语】无忧考网从湖北招生信息网获悉,2021年湖北高考成绩查询时间、方式及入口已公布,6月25日左右5种渠道可查分,具体详情如下:成绩查询时间2021年湖北省高考结束后,网上评卷相关工作正有序进行,6月25日左…...
公司自己做网站流程和备案/seo可以提升企业网站的
上一篇文章分析了reactive,readonly方法,这两种方法都是对target进行深度侦测(虽然是延迟侦测),Vue3.0还给我们提供了对target只进行第一层侦测,那就是shallowReactive,shallowReadonly方法。我…...
wordpress菜单分开/谷歌浏览器安卓版下载
准备工作一般分页查询使用子查询优化使用 id 限定优化使用临时表优化关于数据表的id说明当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询…...
怎么保证网站安全性/收录优美图片topit
Samba服务器的配置实验步骤:1、安装有关Samba的RPM包(samba、samba-common、samba-client)2、创建Samba用户3、修改配置文件4、重启samba服务5、设置目录访问权限6、测试具体步骤如下:1、安装RPM包(缺省情况下RHEL5安装了samba的相关软件包,可…...