DELIMITER ;
存储过程是存储在MySQL服务器内部的声明性SQL语句的一部分。
在此示例中,我们刚刚创建了一个名称为的存储过程GetStudents()。
保存存储过程后,可以使用以下CALL语句调用存储过程:
CALL GetStudents();
#查询结果:
如图,该语句返回与查询相同的结果。
-
首次调用存储过程时,MySQL在数据库目录中查找名称,编译存储过程的代码,将其放置在称为缓存的存储区中,然后执行该存储过程。
-
如果你在同一会话中再次调用相同的存储过程,则MySQL将从缓存中执行存储过程,而无需重新编译它。
-
存储过程可以具有参数,因此你可以向其传递值并返回结果。
例如,你可以有一个存储过程,可以按年级和班级返回学生信息数据。在这种情况下,年级和班级是存储过程的参数。
存储过程可能包含控制流语句(例如IF、CASE,这些语句LOOP允许你以过程方式实现代码)。
存储过程可以调用其他存储过程或存储函数,这使你可以调制代码。
一、MySQL存储过程的优势
==============
优点
–
- 减少网络流量
存储过程有助于减少应用程序和MySQL Server之间的网络流量。因为应用程序不必发送多个冗长的SQL语句,而仅发送存储过程的名称和参数。
- 在数据库中集中业务逻辑
你可以使用存储过程来实现可被多个应用程序重用的业务逻辑。存储过程有助于减少在许多应用程序中重复相同逻辑的工作,并使数据库更加一致。
- 使数据库更安全
数据库管理员可以为仅访问特定存储过程的应用程序授予适当的特权,而无需在基础表上授予任何特权。
缺点
–
- 资源使用
如果使用许多存储过程,则每个连接的内存使用量将大大增加。
此外,由于MySQL的逻辑操作设计不佳,因此在存储过程中过度使用大量逻辑操作会增加CPU使用率。
- 故障排除
调试存储过程很困难。不幸的是,MySQL没有像其他企业数据库产品(如Oracle和SQL Server)那样提供任何调试存储过程的功能。
- 维护成本高
开发和维护存储过程通常需要并非所有应用程序开发人员都具备的专门技能。这可能会导致应用程序开发和维护方面的问题。
三、实际应用
======
1. 存储过程(创建)
存储过程简称过程,procedure,是一种用来处理数据的方式存储过程是一种没有返回值的函数
#创建过程语法
Create procedure 过程名字(【参数列表】)
Begin
– 过程体
End
#创建存储过程示例
DELIMITER $$
CREATE PROCEDURE GetStudents()
BEGIN
SELECT
ID,SNAME,SEX,AGE,CLASS,GRADE,HOBBY
FROM
student
ORDER BY SNAME;
END$$
DELIMITER ;
2. 存储过程(查看)
函数的查看方式完全适用于过程,关键字换成procedure查看所有过程:
#查询所有存储过程
Show procedure status
#模糊匹配
Show procedure status [like ‘pattern’]
#示例:显示如下图
Show procedure status like ‘Get%’
# 查看该存储过程的创建语句
Show create procedure 过程名;
3. 存储过程(调用)
CALL GetStudents();
4. 存储过程(修改&删除)
过程不能直接修改,只能先删除再新增
Drop procedure 过程名;
5. 存储过程(参数类型)
函数的参数需要数据类型指定,过程比函数更严格
过程有自己的类型限定,三种类型:
- in:数据只是从外部传入内部使用(值传递)可以是数值也可以是变量
- out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递,外部的数据会被先清空才会进入内部),只能是变量
- inout:外部可以在内部使用,内部修改也可以给外部使用,典型的引用传递;只能传变量
基本语法:
Create procedure 过程名(过程类型 形参名字 数据类型 ,…)
– 过程参数
DELIMITER $$
create procedure demo(in int_1 int,out int_2 int,inout int_3 int)
BEGIN
– 先查看三个变量
SELECT int_1,int_2,int_3;
END$$
DELIMITER ;
调用:out和inout类型的参数必须传入 变量,而不能是数值
正确调用:
1.设置变量
2.传入变量
存储过程对于变量的操作(返回)是滞后的,是在存储过程调用结束的时候,次啊会重新将颞部修改的值赋值给外部传入的全局变量。
– 过程参数
DELIMITER $$
create procedure pro2(in int_1 int,out int_2 int,inout int_3 int)
BEGIN
– 先查看三个变量
SELECT int_1,int_2,int_3;
– 修改局部变量
SET @int_1 = 1;
SET @int_2 = 2;
SET @int_3 = 3;
– 先查看三个局部变量
SELECT int_1,int_2,int_3;
– 先查看三个全局变量
SELECT @int_1,@int_2,@int_3;
– 修改全局变量
SET @int_1 = ‘aaa’;
SET @int_2 = ‘bbb’;
SET @int_3 = ‘ccc’;
– 先查看三个全局变量
SELECT @int_1,@int_2,@int_3;
END$$
DELIMITER ;
测试:传入数据1、2、3,说明局部变量与全局变量无关
最后,在存储过程调用结果结束之后,系统会将局部变量重复返回给全局变量(out和inout)
在存储过程调用结束之后:out类型和inout类型会将过程内部对应的局部变量的值重新返回给对用的传入的全局变量。
6. 存储过程(具体参数解析)
完整创建语法如下:
--------------创建存储过程-----------------
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,…n ]
总结
本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!
MySQL50道高频面试题整理:
out类型和inout类型会将过程内部对应的局部变量的值重新返回给对用的传入的全局变量。
6. 存储过程(具体参数解析)
完整创建语法如下:
--------------创建存储过程-----------------
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,…n ]
总结
本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!
MySQL50道高频面试题整理:
[外链图片转存中…(img-jEbe48P0-1721150122053)]