【数据库——MySQL】(13)过程式对象程序设计——存储函数、错误处理以及事务管理

news2024/11/30 0:28:13

目录

  • 1. 存储函数
  • 2. 存储函数的应用
  • 3. 错误处理
  • 4. 抛出异常
  • 5. 事务处理
  • 6. 事务隔离级
  • 7. 应用实例
  • 参考书籍

1. 存储函数

  1. 创建 存储函数,需要用到 CREATE 语句:

    CREATE FUNCTION 存储函数名([参数名 类型, ...])
    	RETURNS 类型
    	[存储函数体]
    

    注意:存储过程名和存储函数名不能相同!

  2. 调用 存储函数,语法格式如下:

    存储函数名([参数, ...])
    

    :存储过程只能采用 CALL 语句直接调用,而存储函数则可以出现在各种语句中。

  3. 修改 存储函数,需要用到 ALTER 语句:

    ALTER FUNCTION 存储函数名 
    [
    	COMMENT ‘string’
    	| LANGUAGE SQL
    	| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    	| SQL SECURITY { DEFINER | INVOKER }
    }
    

    :上述修改语句只能修改存储函数的属性,不能修改功能!修改存储函数的功能,与修改存储过程功能一样也只能采取先删除后重新定义的方式实现

  4. 删除 存储函数,需要用到 DROP 语句:

    DROP FUNCTION [IF EXISTS] 存储函数名
    
  5. 注意在创建自定义存储函数的时候,需要提供权限

    set GLOBAL log_bin_trust_function_creators = 1;    # 创建自定义函数需要给权限
    

    :上述语句只需要在开启数据库时输入一次即可。

2. 存储函数的应用

【例 1】在数据库 score 中创建存储函数,要求通过给定的学号输出相对应的姓名。

drop FUNCTION if exists f1;
delimiter $
create FUNCTION f1(stu_id char(20))
returns varchar(20)    # 返回学生姓名
begin
	declare sname varchar(20);
	select stu.`name` into sname
	from stu
	where stu.id = stu_id;
	return sname;
end$
delimiter ;
select f1('20191001') as Name;

在这里插入图片描述

【例 2】在数据库 score 中创建存储函数,要求输出每位学生的所修学分总数。

drop FUNCTION if exists getxf;
delimiter $
create FUNCTION getxf(stu_id char(20))
returns decimal(5,1)    # 返回学生总学分
begin
	declare s decimal(5,1) default 0;   # 因为之后要求和,所以给个缺省值0
	select sum(if(score.score >= 60, lesson.xf, 0)) into s
	from score join lesson on score.LessonId = lesson.lessonid
	where score.stuId = stu_id;
	return s;
end$
delimiter ;
select stu.id, stu.`name`, IFNULL(getxf(stu.id),0) as 学分
from stu;

在这里插入图片描述

3. 错误处理

在执行 SQL 语句后,可能有时会出错,那么大家可以根据报错编号在 MySQL 手册里面查找出错原因。

错误处理语句:

DECLARE 处理动作 HANDLER 
    FOR 条件值 ,...
    处理语句过程体

4. 抛出异常

我们还可以自定义错误代码以及抛出异常值:

SIGNAL SQLSTATE 错误编号(自定义,不能与系统已有编号重复)
SET message_text = 错误提示信息;

示例如下:

SIGNAL SQLSTATE '12345' 
set message_text = '证件号不存在';

5. 事务处理

  1. 关闭自动提交
    自动提交常用语银行系统中,比如小邓给森林转了 1 元的写博客助力费,那么这个动作应该是同步的,即小邓银行账户扣除 1 元,与此同时,森林银行账户增加 1 元(假设小邓银行账户刚好有 1 元,足够扣除)。不能说小邓银行账户扣除 1 元,但森林银行账户余额不变(比如转钱信号传输中受到干扰导致信号未正确传输)。

    这时候 关闭自动提交 就可以实现解决这种情况。当完成一系列操作后,只有手动提交事务,才能算是实现了之前的所有操作!

    SET @@AUTOCOMMIT = 0;
    

    :默认是开启自动提交的,即 SET @@AUTOCOMMIT = 0;

  2. 开始事务

    START TRANSACTION
    	SQL语句
    
  3. 结束事务

    COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
    
  4. 撤销事务

    ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
    
  5. 回滚事务到指定点
    回滚前需要先设置一个保存点:

    SAVEPOINT 保存点名
    

    然后才可以回滚事务:

    ROLLBACK [WORK] TO SAVEPOINT 保存点名
    

6. 事务隔离级

  1. 脏读(dirty reads):一个事务读取了另一个未提交的并行事务写的数据。
  2. 不可重复读(non-repeatable reads):一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。
  3. 幻读(phantom read):一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。

以上 3 种情况是我们不想看见的。

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
	SERIALIZABLE					//可序列化
	| REPEATABLE READ				//可重复读
	| READ COMMITTED				//提交读
	| READ UNCOMMITTED				//未提交读

如果指定GLOBAL,那么定义的隔离级将适用于所有的SQL用户;如果指定SESSION,则隔离级只适用于当前运行的会话和连接。

基于 ANSI/ISO SQL 规范,MySQL 提供了 4 种隔离级:序列化、可重复读、提交读和未提交读

查看当前事务隔离级:

SELECT @@TRANSACTION_ISOLATION;

7. 应用实例

请自行创建数据库 bank,并在里面新建一个表 account,表内容如下:

在这里插入图片描述

下面完成转账操作:

set @@autocommit = 0;    # 关闭自动提交功能

select * from account;

update account
set ck = ck - 500
where id = '001';

SAVEPOINT a;    # 保存点(rollback时只撤销后面的操作)

update account
set ck = ck + 500
where id = '002';

select * from account;

此时还未提交事务,大家可以在可视化界面刷新表 account,发现数据并没有更新。这是因为我们关闭了自动提交,因此要手动提交事务:

COMMIT;

在这里插入图片描述

参考书籍

《MySQL实用教程(第4版)》

上一篇文章:【数据库——MySQL】(12)过程式对象程序设计——存储过程

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

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

相关文章

ESP32IDF — 硬件I2C使用教程

前言 (1)最近刚做完ESP32的一个模块的驱动移植,使用到了I2C。感觉ESP32的硬件I2C还是挺容易使用的。 (2)本文将只会介绍ESP32的硬件I2C使用,如果想知道软件I2C使用,可看其他的任意一款芯片软件I…

双指针算法——移动零

双指针算法——移动零😎 前言🙌题目详情:图解分析:代码分享:B站讲解视频链接: 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧…

数据集笔记:华盛顿共享单车OD数据

2010~2022 共享单车OD数据 数据地址:Index of bucket "capitalbikeshare-data"

STM32F4X UCOSIII任务消息队列

STM32F4X UCOSIII任务消息队列 任务消息队列和内核消息队列对比内核消息队列内核消息队列 UCOSIII任务消息队列API任务消息队列发送函数任务消息队列接收函数 UCOSIII任务消息队列例程 之前的章节中讲解过消息队列这个机制,UCOSIII除了有内核消息队列之外&#xff0…

【数据结构】队列实现+层序遍历详解+一些练题

欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言队列的实现层序遍历详解强化练习1.判断是不是完全二叉树求二叉树的最大深度 总结 前言 国庆到了,也要内卷一下,感…

集合-List集合

系列文章目录 1.集合-Collection-CSDN博客​​​​​​ 2.集合-List集合-CSDN博客 文章目录 目录 系列文章目录 文章目录 前言 一 . 什么是List? 二 . List集合的特点 三 . 常用方法 1.void add(int index, E element): 将指定的元素插入到列表的指定位置。 2.E remove(int in…

1.4.C++项目:仿mudou库实现并发服务器之buffer模块的设计

一、buffer模块: 缓冲区模块 Buffer模块是一个缓冲区模块,用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据,取出数据 三、实现思想 1.实现换出去得有一块内存空间,采用vector ,vector底层是一个…

opencv图像数组坐标系

在OpenCV的Python接口(cv2)中,加载的图像数组遵循以下坐标系和方向约定: 1. **坐标系:** OpenCV的坐标系遵循数学中的坐标系,原点(0, 0)位于图像的左上角。横轴(X轴&…

算法通过村第十一关-位运算|青铜笔记|初始位运算

文章目录 前言1. 数字在计算中的表示拓展:为什么要有原码、反码和补码? 2. 位运算规则2.1 与、或、异或和取反2.2 位移运算2.3 位移运算和乘除的关系2.4 位运算的常用技巧 总结 前言 提示:我的父亲从我出生起便认识我,可他对我的了解却那么少…

自定义Unity组件——AudioManager(音频管理器)

需求描述 在游戏开发中,音频资源是不可或缺的,通常情况下音频资源随机分布,各个音频的操作和管理都是各自负责,同时对于音频的很多操作逻辑都是大同小异的,这就造成了许多冗余代码的堆叠,除此之外在获取各类…

ESP32S3的MPU-6050组件移植教程

前言 &#xff08;1&#xff09;实习公司要搞ESP32BOX的驱动移植&#xff0c;所有资料自己找还是比较折磨人的现在我分享几个官方的组件移植资料&#xff1a; <1>Find the most exciting ESP-IDF components&#xff08;ESP32的官方组件都可以在里面查&#xff0c;按照他…

【李沐深度学习笔记】损失函数

课程地址和说明 损失函数p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 损失函数 损失函数是用来衡量预测值 y ^ \hat{y} y^​或 y ′ y y′与真实值 y y y的差别&#xff0c;下面给出常见的损失函数类型&am…

9.30号作业

1.消息队列实现进程间的通信 服务端 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)typedef struct{ long msgtype; //消息类型char data[1024]; //消息正文 }Msg;#define SIZE sizeof(Msg)-s…

网站被上传webshell

1。原因 2.工具使用 3.步骤

1038 统计同成绩学生

输入样例&#xff1a; 10 60 75 90 55 75 99 82 90 75 50 3 75 90 88 输出样例&#xff1a; 3 2 0 solution #include <stdio.h> int main(){int n, d, k, hash[101] {0}, a[100000];scanf("%d", &n);for(int i 0; i < n; i){scanf("%d&quo…

SpringCloud网关服务

为什么需要网关 官网&#xff1a; https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.3.RELEASE/single/spring-cloud-gateway.html 使用 导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>s…

第7讲:v-bind属性绑定,v-model双向绑定,v-on事件监听使用

目录 1.v-bind双向绑定 2.v-model双向绑定 3.v-on事件绑定 一.v-bind双向绑定 1.v-bind 指令可以在其名称后面带一个参数&#xff0c;中间放一个冒号隔开&#xff0c;这个参数通常是HTML元素的特性&#xff08;attribute&#xff09;&#xff0c;Vue官方提供了一个简写方式…

阿里云ACP知识点(三)

1、弹性伸缩不仅提供了在业务需求高峰或低谷时自动调节ECS实例数量的能力&#xff0c;而且提供了ECS实例上自动部署应用的能力。弹性伸缩的伸缩配置支持多种特性&#xff0c;例如______,帮助您高效、灵活地自定义ECS实例配置&#xff0c;满足业务需求。 标签、密钥对、 实例RAM…

侯捷 C++ STL标准库和泛型编程 —— 3 容器(关联式容器)

3.3 关联式容器 3.3.0 RB-Tree 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树 BST&#xff08;AVL 是另一种&#xff09; rb-tree 提供遍历操作和 iterators&#xff0c;按中序遍历遍历&#xff0c;便可以得到排序状态 不能用 iterator 去改变元素的…

CCC标准——PHY

1.介绍 UWB物理层使用基于频带受限脉冲的脉冲无线电信号波形。UWB物理层主要用于测距&#xff0c;但也可以用于数据通信。在CCC标准中&#xff0c;物理层的具体定义依然基于IEEE 802.15.4z标准中的HRP UWB PHY&#xff0c;支持更高的脉冲重复频率。 对于增强测距设备&#xf…