MySQL 存储过程的实用技巧与最佳实践

MySQL存储过程是一种在数据库中预编译并存储的SQL语句集合,可以用来执行特定的任务或复杂的操作。通过使用存储过程,开发者能够提高SQL代码的重用性、执行效率以及安全性。存储过程允许将复杂的业务逻辑封装在数据库中,从而减少应用程序代码中的复杂度,同时降低了数据库操作的网络延迟。

在本篇文章中,我们将深入探讨MySQL存储过程的基本概念、创建和使用方法,帮助你掌握如何在实际项目中高效地利用存储过程来简化数据库操作。

1.修改结束符

复制代码
delimiter /

2.存储过程实例

(1)创建存储过程格式:

复制代码
create procedure 存储过程名称(in or out 参数1 数据类型,in or out 参数2 数据类型.........)beginxxxxx;end;结束符

其中:in指的是参数为输入参数 把存储过程外面的值 输入到存储过程中 out指的是将存储过程中计算出来的值 输出到外部 in和out 如果不写默认为in

(2)实例

复制代码
create procedure var_out(in a varchar(80),out res varchar(80))beginset res='你好啊!';select a;end;/set @o1='0'; --定义变量 用来接收存储过程的输出参数 call var_out('节昊文',@o1); --调用存储过程 执行存储过程的内容 --节昊文被赋值给输入参数a 并通过select a;语句返回--@o1是传递给输出参数res的地址 存储过程内部会将'你好啊!'赋值给@o1 通过set res='你好啊!'select @o1; --查询并显示@o1的值 /

3.在存储过程中使用if else

复制代码
create procedure ifelse(a int,b int,out res int)beginif a>b thenset res=a+b;elseset res =a-b;end if;end;/set @o1=0;call ifelse(1,2,@o1);select @o1;/set @o1=0; call ifelse(3,2,@o1); select @o1;/

4.在存储过程中使用loop循环打印12345

复制代码
create procedure lp()begindeclare i int default 0;lp:loopset i=i+1;select i;if i=5 thenleave lp;end if;end loop;end;/call lp();/

5.在存储过程中使用case when (常用)

复制代码
create procedure case_when(a int)begincase awhen 1 thenselect 'case 1';when 2 thenselect 'case 2';elseselect 'others';end case;end;/call case_when(1);/call case_when(2);/call case_when(3);/

6.使用存储过程存储MySQL表中记录(一条)

存储MySQL表中的多个值 可以声明多个变量

复制代码
create procedure db_to_var(id int)begindeclare name varchar(30) default '';declare dept_id int default 0;select employee_name,department_id into name,dept_id from employees where employee_id=id;select name,dept_id;end;/call db_to_var(1);/call db_to_var(5);/

7.如何使用存储过程提取MySQL表中所有数据(游标:cusor类型)

游标是MySQL提供的一个数据类型 游标是一个指针 可以向下移动 游标移动时 它指向谁 我们就可以取谁的值 内存地址 指向的是select语句的查询结果 在存储过程当中 我们可以利用游标取表中的每一条记录

如果想取出每一条记录 需要定义一个游标 使用loop循环取每一条记录 让游标每次向下移动 并监视游标 如果游标走到最后一条记录 退出循环

复制代码
declare continue handler for not found set isExit=TURE; --监视游标 如果游标走到最后一条记录 isExit会自动变为Ture
复制代码
create procedure fetch_all()begindeclare id int default 0;declare name varchar(80) default '';declare isExit int default FALSE;declare cs cursor for select employee_id,employee_name from employees;declare continue handler for not found set isExit=TRUE;open cs;lp:loopfetch cs into id,name;select id,name;if isExit thenleave lp;end if;end loop;close cs;end;/call fetch_all();/

可以看到 最后一条信息被打印了两次 当游标查询最后一行时 会出现重复查询的问题 这是因为在循环结束前会执行一次fetch cs into id,name; 然后再检查isExit变量 导致最后一次查询重复 为了解决这个问题 可以在fetch cs into id,name;前加入判断条件 避免重复查询 下面是修改后的存储过程代码:

复制代码
create procedure fetch_all()begindeclare id int default 0;declare name varchar(80) default '';declare isExit int default FALSE;declare cs cursor for select employee_id,employee_name from employees;declare continue handler for not found set isExit=TRUE;open cs;lp:loopfetch cs into id,name;if isExit thenleave lp;end if;select id,name;end loop;close cs;end;/call fetch_all();/

8.删除存储过程

复制代码
drop procedure fetch_all();/

9.恢复结束符

复制代码
delimiter ;

通过本文的学习,你已经了解了MySQL存储过程的基础知识以及如何创建和调用它们。存储过程不仅能够提高数据库操作的效率,还能增强数据处理的灵活性和安全性。掌握存储过程的使用,将大大提升你在数据库管理和开发中的能力。

希望你能在实际开发中应用存储过程,以优化你的数据库设计。如果有任何疑问,欢迎查阅MySQL的官方文档或进一步与社区交流。祝你在数据库编程的道路上越走越远!

相关推荐
2022计科一班唐文12 分钟前
数据库50个练习
数据库
Always_away15 分钟前
数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记1
数据库·笔记·sql·学习
薛晓刚15 分钟前
从Oracle和TiDB的HTAP说起
数据库
Fanche40433 分钟前
Linux-CentOS-7—— 安装MySQL 8
linux·运维·数据库·mysql·centos
呆呆的私房菜44 分钟前
你了解数据库区域和编码吗?
数据库
爱编程的王小美1 小时前
数据一致性:MySQL、HBase和HDFS的协同
mysql·hdfs·hbase
信徒_1 小时前
Kafka 如何保证消息可靠性?
数据库·分布式·kafka
magic 2452 小时前
Spring启示录、概述、入门程序以及Spring对IoC的实现
java·开发语言·数据库·spring
-天凉好秋-2 小时前
Springboot同时支持不同的数据库,Oracle,Postgresql
数据库·spring boot·oracle
不平衡的叉叉树2 小时前
MySql表达式中字符串类型与整型的隐式转换
数据库·mysql