【MySQL】存储过程

举报
原来是咔咔 发表于 2022/03/26 23:37:22 2022/03/26
【摘要】 概念 存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。在pascal语言中,是有过程和函数的区别的,过程可以理解为没有返回值得函数。不过在C语言总,则没有过程这个概念,统一...

概念

存储过程和函数可以理解为一段sql的集合,他们被事先编译好并且存储在数据库中。在pascal语言中,是有过程和函数的区别的,过程可以理解为没有返回值得函数。不过在C语言总,则没有过程这个概念,统一为函数

创建存储过程

create procedure 存储过程名(参数列表)
begin
存储过程体
end

create procedure user_data()
begin
select * from table_a;
end;

调用存储过程

call user_data();

执行结果:
这就是一个简单的存储过程
在这里插入图片描述

参数类型

在上边创建存储过程中,我们知道在user_data()里边可以携带参数的

解释参数

1.in 表示用来输入
2.out 表示用来输出
3.inout 可以用来输入也可以用来输出

携带参数的存储过程

先使用命令删除我们之前创建的user_data的存储过程

drop procedure user_data;

创建在带参数的存储过程

create procedure user_data(in id int)
begin
select * from table_a where id = id;
end

执行带参数的存储过程

在这里插入图片描述

还可以直接输出我们需要字段

在这里插入图片描述

设置变量

declare kaka varchar(225) default ‘我是咔咔’;

在这里插入图片描述

存储过程中的常用数据类型

1.数值类型
int float double decimal(用于钱上)
2.日期类型
timestamp data year
3.字符串
char varchar text

游标的使用

游标也有的资料上称为光标。
我们可以在存储过程中使用游标来对结果集进行循环的处理。
游标的使用步骤基本分为:声明、打开、取值、关闭。
语法:

DECLARE test_cursor CURSOR FOR 结果集; //声明游标
OPEN test_cursor; //打开游标
CLOSE test_cursor; //关闭游标
DECLARE CONTINUE HANDLER FOR NOT FOUND //结果集查询不到数据自动跳出
总结:

游标的声明的语法: declare 游标名称 cursor for 查询语句;
打开光标的语法: open 游标名称;
获取游标数据: fetch 游标名称 into 变量名 1 [,变量名 2 …]
关闭游标的语法: close 游标名称;
游标的基本使用须知:对某个表按照循环的处理,判断循环结束 的条件是捕获 not found 的条件,当 fetch 光标找不到下一条记录的 时候,就会关闭光标然后退出过程。
可能有过 Pascal 编程经验的朋友们都会知道,声明的顺序也是很 重要的,在 SQL 中,我们使用 declare 定义的顺序是:变量、条件、 游标、应用程序
操作 查询出来的数据会放置于临时表中,然后再通过游标去读取数据。

案例

create procedure user_data(out count int)
begin
	declare user_id int;
	-- 游标标识
	declare blag int default 1;
	-- 游标
  declare user_cursor cursor for select data.user_id from mac_user as data;
	-- 处理not fount的异常
	declare continue handler for not found set blag = 0;
  set count = 0;
  -- 打开游标
	open user_cursor;
  -- 执行循环
  read_loop:loop
		-- 获取游标中的值
    fetch user_cursor into user_id;
		-- 检测循环是否
		if blag = 0 then
			-- 跳出循环
			leave read_loop;
		end if;
-- 		if user_id = 1 then
			set count = count + user_id;
-- 		end if;
	end loop read_loop;

	-- 关闭游标
	close user_cursor; 
	select count;

end;

call user_data(@count);  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

命令查看存储过程

show procedure status;
show create procedure kaka;

存储过程的优点

1.第一点优势就是执行速度快,因为我们的每个sql语句执行都需要经过编译,然后在运行,但是存储过程都是直接编译好了之后直接运行即可
2.第二点优势就是减少网络流量,我们传输一个存储过程比我们传输大量的sql语句的开销要小的多
3.第三点就是提高系统安全性,因为存储过程可以使用权限控制,而且参数化的存储过程可以有效的放置slq注入攻击,保证了其安全性
4.第四点就是耦合性降低,当我们表结构发生变化之后,我们可以修改相应的存储过程,我们的应用程序在一定程度上需要改动的地方就比较少了
5.第五点就是重用性强。因为我们在写好一个存储过程之后,再次调用只需要一个名称即可,也就是一次编写,随处调用,而且使用存储过程也可以让程序的模块化加强

存储过程的缺点

1.移植性差。因为存储过程是和数据库绑定的,如果我们更换数据库之类的操作,可能很多地方需要改动。
2.修改不方便。因为对于存储过程而言,我们并不能特别有效的调试,他的一些bug可能发现的会晚,增加了应用的危险性。
3.优势不明显赘余功能。对于小型的web应用来说,如果我们使用语句缓存,发现编译sql的开销并不大,但是使用在存储过程缺需要检查权限一类的开销,这些赘余功能也会在一定程度上拖累性能

文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fangkang7/article/details/97014204

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200