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

Mysql 存储过程

什么是存储过程?

存储过程是事先经过编译并存储在数据库的一段sql语句的集合

如何创建一个存储过程?

create procedure 存储过程名称([参数列表])
beginsql语句;
end#例
create procedure p1()
beginselect * from t_goods;select * from t_user;
end

如果是在命令行中创建存储过程,会遇见分号结束的问题,需要用delimiter来修改sql语句结束的标志
例 “delimiter #” 就是将#作为sql语句结束的标志

怎么使用存储过程?

call 存储过程名称([参数列表])
# 例
call p1()

怎么查看已经创建的存储过程?

# 查询指定数据库的存储过程及状态信息
select * from information_schema.routines where routine_schema='数据库名称' 
# 例
select * from information_schema.routines where routine_schema='seckill'# 查询某个存储过程的定义
show create procedure 存储过程名称
# 例
show create procedure p1

怎么删除一个存储过程?

drop procedure [if exists] 存储过程名称
# 例
drop procedure p1

变量

系统变量

系统变量是mysql服务器提供,分为全局变量(global),会话变量(session)
如果没有指定session/global,默认为session
msyql重启后,设置的全局参数都会失效,要想不失效,可以在/etc/my.cnf中配置(linux)

查看系统变量

# 查看所有系统变量
show [session|global] variables
# 例
show global variables# 通过like模糊匹配查找系统变量
show [session|global] variables like '...'
# 例
show global variables like 'admin%'# 查看指定变量的值
select @@[session|global] 系统变量名
# 例 查autocommit的值
select @@autocommit
select @@session.autocommit

设置系统变量

set [session|global] 系统变量名=# 例
set session autocommit = 0set @@[session|global] 系统变量名=# 例
set @@session.autocommit = 1

用户变量

用户变量是用户自己定义的变量,用户变量不用提前声明,在用的时候直接使用"@变量名"使用就可以,其作用域为当前连接

变量赋值

# 四种方式
set @变量名 =, @变量名 =...
# 例
set @stu_name = 'zdy', @stu_age = 18set @变量名 :=, @变量名 :=...
# 例
set @stu_name := 'zzz', @stu_age := 20select @变量名:=, @变量名 :=...
# 例
select @stu_name := 'zdz', @stu_age := 16select 字段名 from 表名 into @变量名
# 例 将cout(*)的值存入变量
select count(*) from t_user into @user_count

使用

select @变量名1, @变量名2....
# 例
select @stu_name, @stu_age

局部变量

局部成效,要通过declare成名之后才能使用,可作为存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end模块

声明局部变量 (变量类型就是数据库字段类型 int、char、varchar…)

declare 变量名 变量类型[default ...]

变量赋值

set 变量名 =set 变量名 :=select 字段名 from 表名 into 变量名 ...

整体案例

create procedure p3()
begin# 定义变量declare good_count int default 0;# 变量复制select count(*) from t_goods into good_count;# 查询变量值select good_count;
end

存储过程中使用IF条件判断

create procedure p4()
begindeclare score int default 67;declare result varchar(10);if score >= 80 thenset result := '优秀';elseif score >= 60 thenset result := '及格';elseset result := '不及格';end if;select result;
endcall p4()

存储过程参数

参数有三种类型
IN                      该类参数作为输入,也就是需要调用时传入值,也是默认类型
OUT                  该类参数作为输出,也就是该参数可以作为返回值
INOUT              该类参数既可以作为输入参数,也可以作为输出参数

使用

create procedure 存储过程名称([IN/OUT/INOUT 数名 参数类型])
beginsql语句;
end

案例

create procedure p5(in goods_count int, out result varchar(10))
beginif goods_count >= 1 thenset result := '有库存';elseset result := '库存不足';end if;
endcall p5(2, @result)
select @result

存储过程中使用case

语法一

# 如果case_value等于v1则执行statement1语句等于v2则执行statement2语句...否则执行statementn语句
case case_valuewhen v1 then statement1when v2 then statement2...else statementn
end case
# 例
create procedure p7(in month int, out result varchar(10))
begincase monthwhen 1 thenset result := '一月';when 2 thenset result := '二月';when 3 thenset result := '三月';elseset result := '非法参数';end case;
endcall p7(2, @result)
select @result

语法二

# 如果condition1满足执行statement1,如果condition2满足执行statement2...否则执行statementn语句
casewhen condition1 then statement1when condition2 then statement2...else statementn
end case
# 例
create procedure p6(in month int, out result varchar(10))
begincasewhen month >=1 && month <=3 thenset result := '第一季度';when month >=4 && month <=6 thenset result := '第二季度';when month >=7 && month <=9 thenset result := '第三季度';when month >=10 && month <=12 thenset result := '第四季度';elseset result := '非法参数';end case;
endcall p6(2, @result)
select @result

存储过程中使用while

语法(满足条件进入循环)

while 条件 dosql逻辑
end while
# 例 计算1-100的累加
create procedure p8(in n int)
begindeclare sum int default 0;while n > 0 doset sum := sum + n;set n := n - 1;end while;select sum;
endcall p8(100)

存储过程中使用repeat

语法(满足条件退出循环)

repeatsql逻辑until 条件
end repeat
# 例
create procedure p9(in n int)
begindeclare sum int default 0;repeatset sum := sum + n;set n := n - 1;until n < 0end repeat;select sum;
endcall p9(100)

存储过程中使用loop

语法
如果不在sql逻辑中增加退出循环的条件,可以用来实现简单的死循环,loop可以配合下面的两个语句使用
leave 退出循环,相当于Java的break
iterate 跳过当前循环,相当于Java的continue

[label:] loopsql逻辑
end loop [label]
# 例1 1-n的累加
create procedure p10(in n int)
begindeclare sum int default 0;sum:loopif n<=0 thenleave sum;end if;set sum := sum + n;set n := n - 1; end loop sum;select sum;
end
call p10(100)
# 例2 1-n的偶数的累加
create procedure p11(in n int)
begindeclare sum int default 0;count:loopif n<=0 thenleave count;end if;if n%2 = 1 thenset n := n - 1; iterate count;end if;set sum := sum + n;set n := n - 1; end loop count;select sum;
endcall p11(100)

游标类型

游标类型用于存储查询结果集,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch、close

声明游标

declare 游标名 cursor for 查询语句

打开游标

open 游标名称

获取游标记录

fetch 游标名称 into 变量1,变量2...

关闭游标

close 游标名称

案例
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到新创建的一张表(id,name,profession)中

create procedure p12(in uage int)
begin# 1. 声明游标存储结果集 声明时要先声明变量再声明游标declare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name, peofession from tb_user where age <= uage;# 2. 准备:创建表结构create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));# 3. 开启游标open u_cursor;while true do # 这里埋了一个坑 条件处理程序解决# 4. 将游标中的数据插入到新表中fetch u_cursor into uname, upro;insert into tb_user_pro values (null, uname, upro);end while;# 5. 关闭游标close u_cursor;
endcall p12(40)

条件处理程序

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相应的处理过程,语法如下

declare handler_action hanler for condition_value...statement
handler:continue: # 继续执行当前程序exit: # 终止执行当前程序
condition_value:sqlstate sqlstate_value: # 状态码 如 02000sqlwarning: # 所有以01开头的sqlstate代码的简写not found: # 所有以02开头的sqlstate代码的简写sqlexception: # 所有没有被sqlwarning或not found捕获的sqlstate代码的简写

案例

create procedure p12(in uage int)
begin# 1. 声明游标存储结果集 声明时要先声明变量再声明游标declare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name, peofession from tb_user where age <= uage;# 声明条件处理程序declare exit handler for SQLSTATE '02000' close u_cursor;# 2. 准备:创建表结构create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));# 3. 开启游标open u_cursor;while true do# 4. 将游标中的数据插入到新表中fetch u_cursor into uname, upro;insert into tb_user_pro values (null, uname, upro);end while;# 5. 关闭游标close u_cursor;
endcall p12(40)

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是in类型,存储函数能实现的存储过程都能实现,语法如下

create function 存储函数名称([参数列表])
returns type [characteristic...]
beginsql语句;return ...;
end;characteristic:deterministic # 相同的输入参数总是产生相同的结果no sql # 不包含sql语句reads sql data # 包含读取数据的语句,但不包含写入数据的语句# 例 1-n的累加
create function fun1(n int)
returns int deterministic
begindeclare sum int default 0;while n>0 doset sum := sum + n;set n := n - 1;end while;return sum;
endselect fun1(100)

相关文章:

Mysql 存储过程

什么是存储过程&#xff1f; 存储过程是事先经过编译并存储在数据库的一段sql语句的集合 如何创建一个存储过程&#xff1f; create procedure 存储过程名称([参数列表]) beginsql语句; end#例 create procedure p1() beginselect * from t_goods;select * from t_user; end如…...

【LeetCode】每日一题(3)

目录 题目&#xff1a;1234. 替换子串得到平衡字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1234. 替换子串得到平衡…...

websocket学习

1.什么是websocket 1&#xff09;首先websocket和http一样&#xff0c;是一种网络通信协议&#xff0c;来自HTML5的特性&#xff1b; 2&#xff09;他可以使客户端和服务端进行双工通信&#xff0c;简单来说&#xff0c;就是双向通信&#xff1a;比如我们熟悉的http协议&…...

Java面试题及答案整理汇总(2023最新版)

前言 面试前还是很有必要针对性的刷一些题&#xff0c;很多朋友的实战能力很强&#xff0c;但是理论比较薄弱&#xff0c;面试前不做准备是很吃亏的。这里整理了很多面试常考的一些面试题&#xff0c;希望能帮助到你面试前的复习并且找到一个好的工作&#xff0c;也节省你在网…...

公司来了个卷王,我愿称之为王中王,让人崩溃

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。2023年春招就要开始了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&…...

波奇学c语言:代码的编译和链接

test.c&#xff08;源文件&#xff09;->编译->test.obj&#xff08;目标文件&#xff09;->链接->test.exe&#xff08;可执行文件&#xff09;编译1.预编译&#xff08;预处理&#xff09;&#xff1a;text.c->text.i使用gcc -E test.c 进行停止预处理指令&am…...

计算机网络原理--传输层协议(TCP协议十大特性)

目录 1.认识TCP协议 TCP的协议段格式 2. 确认应答机制 3.超时重传 4.连接管理 <...

nvm控制node版本

安装 nvm 1、下载 nvm 官网安装包&#xff1a; github 选择 nvm-setup.exe 下载 2、安装 1、选择 nvm 安装目录&#xff08;可自定义&#xff09; 2、选择 node 安装目录&#xff08;如有安装过&#xff0c;可以选择以前安装目录&#xff0c;可 cdm 输入 where node 查看原nod…...

从0到1一步一步玩转openEuler--13 openEuler用户组管理

文章目录13.1 创建用户组13.1.1 groupadd命令13.1.2 用户组信息文件13.1.3 创建用户组实例13.2 修改用户组13.2.1 修改GID13.2.2 修改用户组名13.3 删除用户组13.4 将用户加入用户组或从用户组中移除13.5 切换用户组在Linux中&#xff0c;每个普通用户都有一个账户&#xff0c;…...

知不知道什么叫米筐量化?怎么来的?

现在量化市场范围越来越大&#xff0c;各种量化系统也是普遍性的了&#xff0c;不过米匡量化这个开发系统通常是由交易接口的专业开发团队开发的的结果&#xff0c;那么米匡量化的终端又是是怎么开发成功的呢&#xff1f;首先&#xff0c;我们可以从api接口的调用来了解&#x…...

Urho3D 事件Events

在脚本中&#xff0c;子系统通过以下全局财产可用&#xff1a;时间、文件系统、日志、缓存、网络、输入、ui、音频、引擎、图形、渲染器、脚本、控制台、debugHud、数据库。请注意&#xff0c;由于WorkQueue和Profiler的低级性质&#xff0c;它们不可用于脚本。 事件本身不需要…...

Rust学习入门--【8】复合类型

复合类型&#xff08;compound type&#xff09; 可以将多个不同类型的值组合为一个类型。 Rust中提供了两种内置的复合数据类型&#xff1a;元组&#xff08;tuple&#xff09;和数组&#xff08;array&#xff09;。 元组类型 元组是一个具有 固定长度 的数据集合 —— 无…...

【整理六】

1、props和state相同点和不同点&#xff1f;render方法在哪些情况下会执行&#xff1f; props是一个从外部传进组件的参数&#xff0c;由于React具有单向数据流的特性&#xff0c;所以他的主要作用是从父组件向子组件中传递数据&#xff0c;它是不可改变的&#xff0c;如果想要…...

Ubuntu20.04安装MySQL5.7与远程连接

一、安装MySQL5.7 1.更换镜像源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.old #备份原来的文件 sudo vim /etc/apt/sources.list #修改sources.list文件配置文件内容如下所示&#xff1a; # 清华镜像源 deb https://mirrors.tuna.tsinghua.edu.cn/ubu…...

【yolov5】首次尝试目标检测利用prompt(完整操作流程)

1、打开prompt 2、切换到pytorch所在环境 conda activate freezing我的环境名是freezing&#xff0c;这里根据自己环境名去激活切换 3、进入到yolov5项目所在路径 激活完环境后立即执行指令当然是无效的&#xff0c;首先要进入到你的项目目录 首先看一下自己的项目在那个位…...

三大指标继续狂飙!重庆啤酒:不惧强弱分化加剧,深耕高端市场

十多年前&#xff0c;重庆啤酒因为9个跌停而被一片唱衰&#xff0c;资本市场经典的“关灯吃面”典故自此出现&#xff0c;被股民沿用至今。不过自2020年&#xff0c;重庆啤酒开始逆转走势&#xff0c;股价连续上涨。2021年重庆啤酒营收突破百亿大关&#xff0c;净赚11.66亿元&a…...

MySQL数据库14——更新和删除数据

SQL里面使用UPDATE更新数据&#xff0c;删除使用DELETE语句。 Mysql要修改一下设置&#xff0c;才能更新&#xff1a; 在左上角菜单栏里面选择偏好栏&#xff0c;取消下面这个红框的勾选 更新单个字段的数据 如果运行环境为MySQL 则使用以下语句进行备份。 CREATE TABLE stu…...

Java面试——MyBatis篇

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

C++的 new 和 delete

文章目录一、new 和 delete 的使用二、operator new 和 operator delete 函数三、new 和 delete 的实现原理四、申请空间和释放空间应配套使用五、定位 new 表达式六、malloc/free 和 new/delete 的区别C语言的动态内存管理函数(malloc、calloc、realloc、free) 虽然可以继续在…...

MySQL 事务原理

文章目录1、事务1.1、ACID 特性1.1.1、原子性undo log1.1.2、一致性1.1.3、* 隔离性1.1.4、持久性redo log1.2、事务控制语句2、隔离级别2.1、隔离级别的分类2.1.1、读未提交 RU2.1.2、读已提交 RC2.1.3、可重复读 RR2.1.4、串行化 SC2.2、并发事务读异常2.2.1、* 脏读2.2.2、*…...

软件测试面试自我介绍/项目介绍居然还有模板?我要是早点发现就好了

目录 1、自我介绍 2、项目介绍 2.1、最全电商项目介绍 2.2、电商项目介绍 2.3、在线教育项目介绍 2.4、互联网金融项目介绍 总结 1、自我介绍 以XXX简历来举例&#xff08;参照下面的案例&#xff0c;编写你的自我介绍&#xff0c;框架就是&#xff1a;我是谁&#xff0…...

new RegExp的使用

1.RegExp是什么 当检索某个文本时&#xff0c;可以使用一种模式来描述要检索的内容。RegExp 就是这种模式 RegExp 对象用于存储检索模式。 var patt1new RegExp("e");当使用该 RegExp 对象在一个字符串中检索时&#xff0c;将寻找的是字符 “e” g &#xff1a;表…...

供应商管理软件如何选型 好用的供应商管理软件推荐

供应商管理是采购中的重要环节。对于很多企业来说&#xff0c;做好内部供应商管理就能在行业竞争中提升自身的效益与竞争能力&#xff0c;供应商已成为一种战略筹码。 但在企业进行供应商管理过程中&#xff0c;往往会遇到供应商信息数据收集不全、等级划分不合理、绩效评价机…...

Python3遍历文件夹提取关键字及其附近字符

要求&#xff1a; 1&#xff0c;遍历文件夹下所有的.xml文件 2&#xff0c;从.xml文件中提取关键字以及左右十个字符 3&#xff0c;输出到excel 一&#xff1a;遍历文件夹找到所有xml文件及其路径 for root, dirs, files in os.walk(self.inputFilePath):for file in files:…...

「1」线性代数(期末复习)

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 第一章 行列式 行列式是一个数&#xff0c;是一个结果三阶行列式的计算&#xff1a;主对角线的乘…...

C++7:STL-模拟实现vector

目录 vector的成员变量 构造函数 reserve size() capacity() push_back 一些小BUG 赋值操作符重载 析构函数 【】操作符重载 resize pop_back Insert 迭代器失效 erase 二维数组问题 总结一下 vector&#xff0c;翻译软件会告诉你它的意思是向量&#xff0c;但其…...

笑死,面试官又问我SpringBoot自动配置原理

面试官&#xff1a;好久没见&#xff0c;甚是想念。今天来聊聊SpringBoot的自动配置吧&#xff1f; 候选者&#xff1a;嗯&#xff0c;SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知&#xff0c;SpringBoot有着“约定大于配置”的理念&#xff0c;这一…...

分布式缓存服务DCS-企业版性能更强,稳定性更高

背景介绍 近年来&#xff0c;随着各行业业务需求急速增加&#xff0c;数据量和并发访问量呈指数级增长&#xff0c;原来只能依附于关系型数据库的传统“缓存”逐渐难以支撑上层业务&#xff0c;开源Redis也面临着如“容量有限”、 “可靠性有限”、 “数据重复拷贝&#xff0c…...

HTTP基本原理

目录URL简单定义格式HTTP和HTTPSHTTP的请求过程。请求响应响应体HTTP2.0总结URL 简单定义 通过一个链接&#xff0c;使我们可以找到网络上的某个资源&#xff0c;这个链接就是URL。 格式 URL并不是随便写的&#xff0c;而是有固定的格式。基本的组成格式如下。 schme://[us…...

【云原生】Kubernetes(k8s)最新版本详细保姆级安装教程

前言 Kubernetes简称k8s&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;k8s目标是让部署容器化的应用简单并且高效&#xff0c;k8s提供了应用部署&#xff0c;规划&#xff0c;更新&#xff0c;维护的一种机制。 本文是总结了在安…...

临清网站建设价格/精准推广

阅读目录 红黑树的平均高度大约为logn。查找是在大量的信息中寻找一个特定的信息元素&#xff0c;在计算机应用中&#xff0c;查找是常用的基本运算&#xff0c;例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法&#xff0c;说是七种&#xff0c;其实二分…...

11号在线 网站开发/网站seo入门基础教程书籍

本文分别介绍桶排序、计数排序和基数排序三种排序算法&#xff0c;这三个算法有着共同的算法思想&#xff0c;下面分别介绍三种排序算法.桶排序桶排序(Bucket Sort)的原理很简单&#xff0c;它是将数组分到有限数量的桶子里。假设待排序的数组a中共有N个整数&#xff0c;并且已…...

软件应用下载安装/seo优化的主要内容

1.1 案例四&#xff1a;使用JS完成后台数据展示的隔行换色的表格&#xff1a;1.1.1 需求&#xff1a;在后台展示数据的页面上&#xff0c;通常使用表格标签进行数据的展示.没有背景的表格比较难看的&#xff0c;可以使用JS控制表格的隔行换色.1.1.2 分析&#xff1a;1.1.2.1 技…...

网站手机端优化/网络营销推广策略

中国移动公布了一季度的业绩&#xff0c;业绩显示盈利有所增长&#xff0c;平均日赚约2.85亿元&#xff0c;看起来这个数据很惊人&#xff0c;不过与此前的赚钱能力相比&#xff0c;它的赚钱能力已有所下滑。中国移动2021年赚了1159亿元&#xff0c;日赚3.17亿&#xff0c;对比…...

哪几个网站做acm题目/营销比较成功的品牌

mysql配置文件详解 0x00 mysql配置文件路径 /etc/my.cnf 0x01 详解 #以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。 [client] port 3…...

劳务外包公司/宁波seo关键词排名优化

说明&#xff1a;装饰模式是在不必改变原类文件和使用继承的情况下&#xff0c;动态的扩展一个对象的功能。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。装饰模式的特点&#xff1b;(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对…...