【数据库——MySQL】(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)    # 返回学生姓名
begindeclare sname varchar(20);select stu.`name` into snamefrom stuwhere 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)    # 返回学生总学分
begindeclare s decimal(5,1) default 0;   # 因为之后要求和,所以给个缺省值0select sum(if(score.score >= 60, lesson.xf, 0)) into sfrom score join lesson on score.LessonId = lesson.lessonidwhere 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 TRANSACTIONSQL语句
    
  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 LEVELSERIALIZABLE					//可序列化| 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.rhkb.cn/news/145644.html

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

相关文章

【计算机网络】DNS原理介绍

文章目录 DNS提供的服务DNS的工作机理DNS查询过程DNS缓存 DNS记录和报文DNS记录DNS报文针对DNS服务的攻击 DNS提供的服务 DNS,即域名系统(Domain Name System) 提供的服务 一种实现从主机名到IP地址转换的目录服务,为Internet上的用户应用程序以及其他…

最快的包管理器--pnpm创建vue项目完整步骤

1.用npm全局安装pnpm npm install -g pnpm 2.在要创建vue项目的包下进入cmd,输入: pnpm create vue 3.输入项目名字,选择Router,Pinia,ESLint,Prettier之后点确定 4.cd到创建好的项目 ,安装依赖 cd .\刚创建好的项目名称\ p…

Redis配置和优化

Redis配置和优化 一 、Redis介绍二、关系数据库和非关系数据库2.1、关系型数据库2.2、 非关系型数据库2.3、 非关系型数据库的产生背景2.4、 关系型数据库和非关系型数据库区别2.5、 总结 三、缓存概念3.1、系统缓存3.2、 缓存保存位置及分层结构3.2.1、DNS缓存3.2.2、 应用层缓…

笔试练习day01

目录 一、选择题 1、格式化输出 2、逻辑判断--短路原则 3、赋值语句 4、左移、异或 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、格式化输出 知识点:格式化输出,%m.ns 2、逻辑判断--短路原则 知识点: else和最近的if匹…

第一次作业题解

第一次作业题解 P5717 【深基3.习8】三角形分类 思路 考的是if()的使用,还要给三条边判断大小 判断优先级&#xff1a; 三角形&#xff1f;直角、钝角、锐角等腰等边 判断按题给顺序来 代码 #include <stdio.h> int main() {int a 0, b 0, c 0, x 0, y 0, z 0…

排序篇(二)----选择排序

排序篇(二)----选择排序 1.直接选择排序 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 直接选择排序: ​ 在元素集合array[i]–array[…

pytorch函数reshape()和view()的区别及张量连续性

目录 1.view() 2.reshape() 3.引用和副本&#xff1a; 4.区别 5.总结 在PyTorch中&#xff0c;tensor可以使用两种方法来改变其形状&#xff1a;view()和reshape()。这两种方法的作用是相当类似的&#xff0c;但是它们在实现上有一些细微的区别。 1.view() view()方法是…

C++指针常量,常量指针以及, 引用和指针的区别

const修饰指针有三种情况 1. const修饰指针 --- 常量指针 2. const修饰常量 --- 指针常量 3. const即修饰指针&#xff0c;又修饰常量 c int main() {int a 10;int b 10;//const修饰的是指针&#xff0c;常量指针&#xff0c;指针指向可以改&#xff0c;指针指向的值不…

分享10个必备的VS Code技巧和窍门,提高你的开发效率

目录 前言 1. 时间线视图&#xff1a;本地源代码控制 2. 自动保存&#xff1a;不再需要按Ctrl S 3. 使用命令面板进行任何操作 4、快速转到文件 5. 快速跳转指定行 6. 快速删除该行 7. 享受使用流畅的光标进行打字 8. 快速格式化代码 9. 使用多光标编辑功能节省时间…

数据计算-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第154讲。 第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&a…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们&#xff0c;你是不是经常为电脑的驱动问题而烦恼&#xff1f;如果是的话&#xff0c;你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前&#xff0c;不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

pytorch第一天(tensor数据和csv数据的预处理)lm老师版

tensor数据&#xff1a; import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …

使用U3D、pico开发VR(二)——添加手柄摇杆控制移动

一、将unity 与visual studio 相关联 1.Edit->Preference->External tool 选择相应的版本 二、手柄遥控人物转向和人物移动 1.添加Locomotion System组件 选择XR Origin&#xff1b; 2.添加Continuous Move Provider&#xff08;Action-based&#xff09;组件 1>…

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…

12、Kubernetes中KubeProxy实现之iptables和ipvs

目录 一、概述 二、iptables 代理模式 三、iptables案例分析 四、ipvs案例分析 一、概述 iptables和ipvs其实都是依赖的一个共同的Linux内核模块&#xff1a;Netfilter。Netfilter是Linux 2.4.x引入的一个子系统&#xff0c;它作为一个通用的、抽象的框架&#xff0c;提供…

Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

Mysql生产随笔

目录 1. Mysql批量Kill删除processlist 1.1查看进程、拼接、导出、执行 1.2常见错误解决方案 2.关于时区 3.内存占用优化 记录一下生产过程中的一些场景和命令使用方法&#xff0c;不定期进行更新 1. Mysql批量Kill删除processlist 1.1查看进程、拼接、导出、执行 sho…

Java后端接口编写流程

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Java后端接口编写流程 Java后端接口编写流程&#xff0c;更具业务逻辑编写Java后端接口&#xff0c;提供给前端访问 实现逻辑流程 POJO&#xff1a;实体类编写 Data B…

黑豹程序员-架构师学习路线图-百科:Java

1、简介 Java是Sun公司推出的一门面向对象的编程语言&#xff0c;它是一种通过解释方式来执行的语言。 它出身名门&#xff0c;简化C而来&#xff0c;但并未照搬。继承了C语言各种优点&#xff0c;却摒弃了C里的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单…

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 上一篇&#xff0c;我们介绍了动画剪辑、动画组件以及基本的使用流程&#xff0c;感兴趣的朋友可以前往阅读&#xff1a; CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天&#xff0c;主要介绍动画编辑器相关功能…