当前位置: 首页 > news >正文

【数据库——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 种情况:BEFOREAFTER

每个类型每种情况的触发器在一张表只能设置 1,即一张表最多只有 6 个触发器。

对于 事件、全局锁、表锁、行锁和死锁 的内容在此不过多赘述,大家要是感兴趣可以自行了解~

2.5 触发器示例

使用 bank 数据库,创建表 info,利用触发器完成以下内容。下面会给出如何用 SQL 语句创建触发器并完成相应功能。

info 的内容如下:

在这里插入图片描述

  1. 插入存取款记录(触发器 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);		# 会显示账号不存在
    

    在这里插入图片描述

  2. 创建触发器 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;
    

    在这里插入图片描述
    可见张三的账户金额出现了负数,这其实是异常结果,所以大家可以自行在源代码里面新增报告异常的语句。

    按照道理来说不会出现这种情况,可能是我之前操作数据时改变了记录~

  3. 创建触发器 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 声明游标 要使用游标&#xff0c;需要用到 DECLAR…...

位移贴图和法线贴图的区别

位移贴图和法线贴图都是用于增强模型表面细节和真实感的纹理贴图技术&#xff0c;但是它们之间也存在着差异。 1、什么是位移贴图 位移贴图&#xff1a;位移贴图通过在模型顶点上定义位移值来改变模型表面的形状。该贴图包含了每个像素的高度值信息&#xff0c;使得模型的细节…...

【typescript】面向对象(下篇),包含接口,属性的封装,泛型

假期第八篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 面向对象&#xff1a;程序中所有的操作都需要通过对象来完成 计算机程序的本质就是对现实事物的抽象&#xff0c;抽象的反义词是具体。比如照片是对一个具体的…...

基于SpringBoot的视频网站系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 视频分享管理 视频排名管理 交流论坛管理 留言板管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运…...

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

问题&#xff1a; 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

参考&#xff1a;超详细的PycharmAnconda安装配置教程_pycharm conda_罅隙的博客-CSDN博客 下载好anaconda安装后&#xff0c;比如我们安装在D盘anaconda文件夹下&#xff0c;在pycharm配置好环境激活时出现问题&#xff0c;可能是电脑没有配置环境变量 需要将一下4行添加到电…...

2023年CSP-J真题详解+分析数据

目录 亲身体验 江苏卷 选择题 阅读程序题 阅读程序(1&#xff09; 判断题 单选题 阅读程序(2) 判断题 单选题 阅读程序(3) 判断题 单选题 完善程序题 完善程序(1) 完善程序(2) 2023CSP-J江苏卷详解 小结 亲身体验 2023年的CSP-J是在9月16日9:30--11:30进行…...

10.3 调试事件转存进程内存

我们继续延申调试事件的话题&#xff0c;实现进程转存功能&#xff0c;进程转储功能是指通过调试API使获得了目标进程控制权的进程&#xff0c;将目标进程的内存中的数据完整地转存到本地磁盘上&#xff0c;对于加壳软件&#xff0c;通常会通过加密、压缩等手段来保护其代码和数…...

深度学习实战基础案例——卷积神经网络(CNN)基于MobileNetV3的肺炎识别|第3例

文章目录 前言一、数据集介绍二、前期工作三、数据集读取四、构建CA注意力模块五、构建模型六、开始训练 前言 Google公司继MobileNetV2之后&#xff0c;在2019年发表了它的改进版本MobileNetV3。而MobileNetV3共有两个版本&#xff0c;分别是MobileNetV3-Large和MobileNetV2-…...

机器学习 面试/笔试题(更新中)

1. 生成模型 VS 判别模型 生成模型&#xff1a; 由数据学得联合概率分布函数 P ( X , Y ) P(X,Y) P(X,Y),求出条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X)的预测模型。 朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型&#xff08;LDA&#xff09;、限制玻尔兹曼机…...

【算法题】100019. 将数组分割成最多数目的子数组

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个只包含 非负 整数的数组 n…...

commons-io工具类常用方法

commons-io是Apache Commons项目的一个模块&#xff0c;提供了一系列处理I/O&#xff08;输入/输出&#xff09;操作的工具类和方法。它旨在简化Java I/O编程&#xff0c;并提供更多的功能和便利性。 读取文件内容为字符串 String path"C:\\Users\\zhang\\Desktop\\myyii\…...

【Typescript】面向对象(上篇),包含类,构造函数,继承,super,抽象类

假期第七篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 面向对象&#xff1a;程序中所有的操作都需要通过对象来完成 计算机程序的本质就是对现实事物的抽象&#xff0c;抽象的反义词是具体。比如照片是对一个具体的…...

【python】python中字典的用法记录

文章目录 序言1. 字典的创建和访问2. 字典如何添加元素3. 字典作为函数参数4. 字典排序 序言 总结字典的一些常见用法 1. 字典的创建和访问 字典是一种可变容器类型&#xff0c;可以存储任意类型对象 key : value&#xff0c;其中value可以是任何数据类型&#xff0c;key必须…...

基于Java的大学生心理咨询系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

Redis-双写一致性

双写一致性 双写一致性解决方案延迟双删&#xff08;有脏数据的风险&#xff09;分布式锁&#xff08;强一致性&#xff0c;性能比较低&#xff09;异步通知&#xff08;保证数据的最终一致性&#xff0c;高并发情况下会出现短暂的不一致情况&#xff09; 双写一致性 当修改了数…...

CustomTkinter:创建现代、可定制的Python UI

文章目录 介绍安装设置外观与主题外观模式主题设置自定义主题颜色窗口缩放CTkFont字体设置CTkImage图片Widgets窗口部件CTk Windows窗口CTk窗口CTkInputDialog对话框CTkToplevel顶级窗口布局pack布局palce布局Grid 网格布局Frames 框架Frames滚动框架...

终极指南:使用Legacy-iOS-Kit轻松降级、越狱和修复旧款iOS设备

终极指南&#xff1a;使用Legacy-iOS-Kit轻松降级、越狱和修复旧款iOS设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

OpenClaw智能截图:nanobot自动识别图片中的文字信息

OpenClaw智能截图&#xff1a;nanobot自动识别图片中的文字信息 1. 为什么需要智能截图工具 在日常工作和学习中&#xff0c;我们经常遇到需要从图片中提取文字的场景。比如截取网页上的技术文档片段、保存会议白板上的讨论要点、或者整理纸质书籍中的关键段落。传统做法是手…...

医疗文本处理实战:用jieba分词器搞定妇科专业术语分词(附完整词典配置)

医疗文本处理实战&#xff1a;用jieba分词器精准解析妇科专业术语 在医疗信息化和自然语言处理领域&#xff0c;专业术语的准确识别一直是技术难点。特别是妇科临床文本中&#xff0c;"妇科凝胶"、"宫颈刮片"等复合型专业词汇的切割问题&#xff0c;直接影…...

vscode-drawio扩展依赖更新:安全高效地管理第三方库

vscode-drawio扩展依赖更新&#xff1a;安全高效地管理第三方库 【免费下载链接】vscode-drawio This unofficial extension integrates Draw.io (also known as diagrams.net) into VS Code. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-drawio vscode-drawio…...

PvZ Toolkit:植物大战僵尸终极修改器完全指南

PvZ Toolkit&#xff1a;植物大战僵尸终极修改器完全指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款专为植物大战僵尸PC版设计的综合性游戏修改工具&#xff0c;通过内存读写…...

3步搞定B站音频提取:BilibiliDown开源工具的终极指南

3步搞定B站音频提取&#xff1a;BilibiliDown开源工具的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi…...

终极指南:使用compressorjs实现专业级前端图片压缩与编辑功能

终极指南&#xff1a;使用compressorjs实现专业级前端图片压缩与编辑功能 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库&#xff0c;使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs…...

AI+医疗从模型到产品:做一个真正可用系统,需要跨过哪些坎?

# AI医疗从模型到产品&#xff1a;做一个真正可用系统&#xff0c;需要跨过哪些坎&#xff1f;做 AI医疗的人&#xff0c;常常会经历一个很像的阶段。前期我们把大部分精力放在模型上&#xff1a;换 backbone、调 loss、做多模态融合、补校准、压错误样本&#xff0c;最后终于把…...

冥想第一千八百三十三天(1833)

1.昨天晚上电动车刹车终于修好了&#xff0c;刹车更紧了&#xff0c;今天的天气很热了&#xff0c;明天就还薄款的运动衣。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。...

【跟韩工学Ubuntu第5课】-第5章 网络管理:Netplan、路由与防火墙-004篇-Ubuntu Server 网络管理:进阶配置、优化与实战诊断

文章目录 Ubuntu Server 网络管理:进阶配置、优化与实战诊断 (扩容优化版 | 适配高校教学+生产实战 | 30页核心内容) 5.1 网络基础:深入理解与实践查看(扩容+优化) 一、核心概念进阶(新增计算案例+场景区分) 二、必备诊断命令(新增高频参数+中文注释) 三、IPv6 完整配…...