MySQL 储存过程

news2024/11/9 6:17:45

前言

存储过程(Stored Procedure)是一组预定义的SQL语句集合,它们被保存在数据库中并可供重复调用。存储过程可以接受参数、执行查询和更新操作,并返回结果。使用存储过程,可以实现复杂的业务逻辑和数据操作,提高数据库应用的性能和安全性。


创建储存过程

以下是MySQL存储过程的基本语法结构:

create procedure procedure_name (IN|OUT|INOUT)
	begin
		-- 执行的sql语句和操作
	end;

存储过程可以使用IN、OUT和INOUT参数来传递数据。IN参数用于向存储过程传入值,OUT参数用于从存储过程返回值,而INOUT参数则可用于双向传递数据。每个参数都需要指定名称和数据类型。

存储过程的主体部分包括BEGIN和END之间的SQL语句和操作。在存储过程中,可以包含变量、流程控制语句(如IF、WHILE)、条件语句、循环语句等,以实现复杂的逻辑处理。

示例:

-- 创建一个实现加法的储存过程,a和b为输入参数,c为输出参数
create procedure pro_add (in a int,in b int,out c int)
	begin
		set c=a+b;  -- set用于设置或修改变量
	end;

调用储存过程

在创建储存过程后,可以使用CALL语句调用它。

示例:

调用以上加法储存过程

set @c=0;  -- 设置变量@c用来接收值
call pro_add(2,5,@c);  -- 调用储存过程
select @c from dual;  -- 查询变量@c的值(dual为系统表,定义的变量值都储存在其中)

@c|
--+
 7|

储存过程中变量的使用

在SQL中,变量可以用于存储临时数据,并在查询或存储过程的执行过程中进行操作和引用。

两种常见的变量类型:局部变量和用户变量

  • 局部变量: 局部变量是在存储过程、函数或批处理中声明的变量,其作用范围仅限于所在的代码块或语句。局部变量通常用于存储临时数据,在代码块内进行计算和操作。

局部变量可以使用DECLARE语句进行声明,并且必须在使用之前先进行声明。

语法:

declare attr_name data_type [default value];

示例:

create procedure pro_test1(in a int,out b int)
begin
	declare x int default 1;  -- 定义x int类型 默认值为1
	declare y int default 2;	
	set x=a*a;
	set y=a/2;
	set c=x+y;
end;

  • 用户变量: 用户变量是由用户自定义并在当前会话中使用的变量,相当于全局变量。用户变量的作用范围可以涵盖整个会话,对话的所有语句都可以引用和修改这些变量。

用户变量通常以@符号开头,但不同的数据库管理系统可能对用户变量的命名规则有所差异。一般情况下,用户变量可以在任何查询语句中使用,并且无需事先声明。

例如:

set @c=0;

不管是局部变量还是用户变量都可以用set来修改变量的值。


储存过程中流程的控制

分支语句

IF语句
if condition then
	statements;
elseif condition then
	statements;
else
	statements;
end if;

其中,condition是需要判断的条件表达式,statements是满足条件时需要执行的代码块。


CASE语句

CASE语句有两种形式:简单CASE表达式和搜索CASE表达式

  • 简单CASE表达式:简单CASE表达式基于一个表达式的值来匹配多个可能的结果。

语法:

case expression
	when value1 then 
		statements1;
	when value2 then 
		statements2;
	...
	else 
		statementsN;
end case;

其中,expression是需要比较的表达式,value1、value2等是可能匹配的值,statements1、statements2等是与匹配值对应的代码块,ELSE子句是可选的,默认情况下当没有匹配时执行的代码块。


  • 搜索CASE表达式:搜索CASE表达式根据一系列的条件进行匹配,执行与第一个满足条件的分支相关联的代码块。

语法:

case 
	when condition1 then 
	statements1;
	when condition2 then
	statements2;
	...
	else
	statementsN;
end case;

其中,condition1、condition2等是需要进行判断的条件表达式,statements1、statement2等是与条件对应的代码块,ELSE子句是可选的,默认情况下当没有条件匹配时执行的代码块。


循环语句

  • WHILE循环:WHILE循环会根据特定的条件来判断是否继续执行循环内的代码块。

语法:

while condition do
	statements;
end while;

其中,condition是需要判断的条件表达式,statements是需要重复执行的代码块。


  • REPEAT循环:REPEAT循环会先执行一次代码块,然后根据条件判断是否继续执行循环。

语法:

repeat
	statements;
until condition end repeat;

其中,statements是需要被重复执行的代码块,condition是一个条件表达式,判断是否继续执行循环。


  • LOOP循环:LOOP循环会无限循环执行其中的代码块,直到遇到LEAVE语句或满足某种条件时跳出循环。

语法:

loop_label:loop
	statements;
	if condition then 
		leave loop_label;
	end if;
end loop loop_label;

其中,loop_label是标识循环的名称,statements是需要被重复执行的代码块,condition是需要判断的条件表达式。


储存过程管理

查询储存过程

-- 查询所有储存过程
show procedure status;

 查询结果:


-- 查询指定数据库的储存过程
show procedure status where db='test2';

 查询结果:


-- 查询储存过程的创建细节
show create procedure test2.pro_add;

查询结果: 


修改储存过程

当你想要修改一个已经存在的储存过程时,可以使用ALTER PROCEDURE语句。

语法:

alter procedure procedure_name [characteristic ...]
procedure_definition

其中,procedure_name是要修改的存储过程的名称。characteristic是可选的特征列表(例如指定安全权限、确定语言等),procedure_definition则是存储过程的新定义,包括参数、变量、逻辑和SQL语句等。

在MySQL中,你可以使用特征(characteristics)来定义存储过程的属性和行为。下面是一些常用的特征:

  1. DETERMINISTIC: 表示存储过程是确定性的,即对于给定的输入参数,每次执行都会得到相同的结果。这个特征可以提供一些性能优化。
  2. NOT DETERMINISTIC: 表示存储过程是非确定性的,即对于给定的输入参数,每次执行可能会得到不同的结果。这是默认的特征。
  3. CONTAINS SQL: 表示存储过程包含SQL语句。这是默认的特征。
  4. NO SQL: 表示存储过程不包含SQL语句,通常用于执行计算或控制逻辑。
  5. READS SQL DATA: 表示存储过程读取数据,但不修改数据。这是默认的特征。
  6. MODIFIES SQL DATA: 表示存储过程修改数据。
  7. SQL DATA ACCESS {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}: 通过这个特征,你可以明确指定存储过程的数据访问方式。

示例:

-- 创建储存过程
create procedure greet() 
reads sql data
begin 
	select 'Hello,world!'; 
end;

-- 修改储存过程特征
alter procedure greet not determinstic;

删除储存过程

语法:

drop procedure procedure_name;

其中,procedure_name是要删除的储存过程的名称。 


游标

在Mysql中,使用储存过程和游标可以完成对查询结果集的遍历和处理。

声明游标

declare cursor_name cursor for select_statement;

 其中,cursor_name是游标的名称,select_statement是用于获取结果集的查询语句。


打开游标

open cursor_name;

获取数据

fetch cursor_name into variable_list;

其中,variable_list是一个变量列表,用于接收结果集中的列值。可以使用多个变量来接收不同列的值。 


关闭游标

close cursor_name;

示例:

-- 创建储存过程
create procedure pro_test2(out result varchar(200))
begin
	declare cid int;
	declare cname varchar(20);
	declare str varchar(50);
	declare num int;
	declare i int;
	-- 定义游标
	declare cur cursor for select class_id,class_name from classes;
	-- 获取表中记录数
	select count(*) into num from classes;
	set i=0;
	open cur;  -- 打开游标
    -- 获取并处理数据
	while i<num do
	fetch cur into cid,cname;  -- 获取数据
	set str=concat_ws('~',cid,cname); -- 拼接数据
	set result=concat_ws(',',result,str);
	set i=i+1;
	end while;
	close cur;  -- 关闭游标
end;

set @a='';
call pro_test2(@a);
-- 查询结果
select @a from dual;

@a                                     |
---------------------------------------+
1~2022软件1,2~2022软件2,3~2022软件3,4~2022软件4|

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

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

相关文章

浅谈微服务异步解决方案

导言 异步是一种设计思想&#xff0c;不是设计目的&#xff0c;因此不要为了异步而异步&#xff0c;要有所为&#xff0c;有所不为。 异步不是『银弹』&#xff0c; 避免试图套用一个『异步框架』解决所有问题&#xff0c; 需要根据不同的业务特点或要求&#xff0c;选择合适的…

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金

近日&#xff0c;在日本千叶县举办的2023年第64届国际数学奥林匹克&#xff08;IMO&#xff09;竞赛公布比赛结果&#xff0c;中国队连续5年获得团体第一。奖牌榜显示&#xff0c;代表中国参赛的6名队员全部获得金牌。其中&#xff0c;猿辅导学员王淳稷、孙启傲分别以42分、39分…

Ubuntu 离线部署的常见操作

Ubuntu 离线安装的常见操作 **说明&#xff1a;**很多情况下,生产环境都是离线环境&#xff0c;然而开发环境都是互联网的环境&#xff0c;因此部署的过程中需要构建离线安装包; 1. 下载但是不安装 # 例如使用 apt 下载 wireshark 安装包 sudo apt download wireshark # 下载…

gitee修改代码提交操作步骤说明

一&#xff0c;简介 本文主要介绍如何从gitee仓库下载文件&#xff0c;本地修改&#xff0c;本地提交&#xff0c;然后再push到远程服务器的操作步骤。供参考&#xff0c;欢迎一起讨论交流~ 二&#xff0c;操作步骤 总的操作步骤分为以下几步 1&#xff0c;远程服务器下载文…

Seata的四种分布式事务模式

文章目录 一、XA模式1、XA模式原理2、seata的XA模式3、优缺点4、代码实现 一、XA模式 1、XA模式原理 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准&#xff0c;XA 规范 描述了全局的TM与局部的…

【动态规划】子序列系列

文章目录 动态规划&#xff08;子序列系列&#xff09;1. 最长递增子序列2. 摆动序列3. 最长递增子序列的个数4. 最长数对链5. 最长定差子序列6. 最长的斐波那契子序列的长度7. 最长等差数列8. 等差数列划分 || - 子序列 动态规划&#xff08;子序列系列&#xff09; 1. 最长递…

正泰电力携手图扑:VR 变电站事故追忆反演

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…

<C++>二、类和对象-构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生…

为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用

微软日前确认今年4季度推出Win11 23H2&#xff0c;这是Win11第二个年度更新。 Win11 23H2具体有哪些功能升级&#xff0c;现在还不好说&#xff0c;但它会集成微软的Copilot&#xff0c;它很容易让人想到多年前的“曲别针”助手&#xff0c;但这次是AI技术加持的&#xff0c;Co…

使用Vue+CSS实现汉堡图标过渡为叉号图标,有点意思

本文给大家分享三个具有过渡效果的汉堡图标&#xff0c;当点击汉堡图标时&#xff0c;过渡为叉号图标。这种具有过渡特效的图标挺炫酷的&#xff0c;感觉一下子给网页增加一点新颖特色。早在2015年左右&#xff0c;国外挺多优秀门户网站都有使用类似的图标&#xff0c;那时不知…

Mysql之binlog日志浅析

一、binlog日志简介 Binlog是MySQL数据库中的二进制日志&#xff0c;用于记录数据库中所有修改操作&#xff0c;包括增删改等操作。binlog以二进制格式保存&#xff0c;可以通过解析binlog文件来查看数据库的操作历史记录。binlog日志可以用于数据恢复、数据备份、数据同步等场…

智慧水务和物联网智能水表在农村供水工程中的应用

摘 要&#xff1a;随着社会的进步和各项事业的飞速发展&#xff0c;人民生活水平的逐步提升&#xff0c;国家对农村饮水安全有了更高的要求&#xff0c;为了进一步提升农村供水服务的质量&#xff0c;利用现代化、信息化科学技术提升农村供水服务质量&#xff0c;提高用水管理效…

对象分割技术在图像重绘上的运用

今年早些时候&#xff0c;Meta AI 发布了他们的新开源项目: Segment Anything Model&#xff08;SAM) &#xff0c;在计算机视觉社区引起了巨大的轰动。SAM 是一种快速分割系统&#xff0c;它擅长于对不熟悉的物体和图像进行零样本泛化&#xff0c;而不需要额外的训练。 在本教…

安全测试国家标准解读——函数调用安全、异常处理安全、指针安全

下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解&#xff0c;该标准是2020年4月28日&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&…

DCDC下垂控制算法

在并联的DC/DC转换器系统中&#xff0c;下垂控制&#xff08;Droop Control&#xff09;是一种常见的方法&#xff0c;用以实现在不同模块之间的功率均衡。在下垂控制策略中&#xff0c;每一个转换器的输出电压会随着负载的增加而减小&#xff0c;这样能够保证所有的转换器都在…

CSS font-family 等宽字体

CSS font-family 等宽字体 font-family: "Lucida Console", Consolas, "Courier New", Courier, monospace; font-family: Courier New, Courier, Lucida Console, Consolas, monospace; font-family: Courier, Lucida Console, Consolas, Courier New,…

【数学建模】2023 深圳杯 东三省 数学建模 B题 :电子资源版权保护问题 (基于DCT的暗水印信息嵌入模型)

在文章末尾的公众号回复&#xff1a;深圳杯B题&#xff0c;获取完整内容。 本文的文本、公式、代码都是部分展示。 文章目录 一、题目二、思路 与 解答2.1 问题一2.11 LSB 方法测试2.12 LSB 方法建模 2.2 问题二2.3 问题三2.31 方法与步骤概述2.32 基于DCT的暗水印信息嵌入模型…

第八章 HL7 架构和可用工具 - 测试转换

文章目录 第八章 HL7 架构和可用工具 - 测试转换显示段地址显示字段地址批量消息 测试转换 第八章 HL7 架构和可用工具 - 测试转换 显示段地址 要显示段地址&#xff0c;请将光标悬停在阴影列中的段名称上。工具提示显示以下内容&#xff1a; 在虚拟属性路径中使用的段地址该…

CSS样式中颜色与颜色值的应用

使用CSS描绘页面样式时&#xff0c;颜色是其中不可或缺的&#xff0c;无论是对文本、背景还是边框、阴影&#xff0c;我们都写过无数代码用来增添颜色。而为了让网页的色彩表现更出色&#xff0c;我们很有必要完整梳理下CSS中的色彩。 要讲清楚CSS中的颜色&#xff0c;离不开颜…

windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务

一、问题描述及解决原理 把项目发布到windows服务器中&#xff0c;如tomcat工程不稳定&#xff0c;会有无故宕机的问题。如果通过程序无法解决&#xff0c;并且重启tomcat服务能够生效的话&#xff0c;可以做一个自动检测并重启的脚本。 脚本通过检测tomcat对应的工程链接&…