3.Mysql 存储过程

余生长醉 提交于 2020-03-06 12:55:12

1.概念

存储过程和函数可以理解为一段SQL语句的集合,他们事先编译好并存储在数据库中。

2.运用场景

对数据进行分析汇总要转换为自己系统需要的数据格式的时候。

3.创建和调用

创建

create procedure 存储过程名称(参数列表)
	其他修饰符
	存储过程

调用

call 存储过程名称()

4.例子

DROP procedure xx_procedure;
create procedure xx_procedure(in x int)  -- in表示输入 
begin
	select * from user where id = x;
end
-- 执行
call xx_procedure(1);

参数类型
1.分类:in、out、inout
2.定义:
(1)in 表示输入参数
(2)out 表示输出参数
(3)inout 表示可以用来输入,也可以用来输出

5.理解

1.存储过程就等同于SQL语句,他的结果与直接执行SQL的结果是一样的,好处就是逻辑封装在数据库端。
2.当我们调用存储过程时,不需要理解它的内部逻辑,一旦逻辑变化只需要在数据库端修改存储过程,对调用 它的系统没有任何影响。
3.可以简化开发人员的很多工作,减少数据库在是数据库和应用服务器之间的传输,可以提高数据处理效率。

6.变量

1.存储过程中可以定义变量,用declare来定义,它的作用域只在begin … end 之中。
2.变量的定义必须在语句的开头,并且在其他语句之前。可以一次性声明多个变量,使用default在赋予默认值。
3.语法: declare 变量名1 [,变量名2…] 变量类型 [default默认值]
4.变量可以赋予默认值,也可以接收查询返回值
5.直接赋值使用set,语法:set 变量名 = 值。
6.也可以通过查询结果赋值,要求结果只有一行数据,语法 select 列名 into 变量名 from 表名 其他语句。

Drop procedure xx_procedure;
create procedure xx_procedure(in x int, out y varchar(20))
begin
	declare s varchar(20);
	select xx_name into s from `user` where id = x;
	set y = s;
end
--执行
call xx_procedure(1, @a);
select @a;

7.数据类型

1.数值类型:int、float、double、decimal
2.日期类型:timestamp、date、year
3.字符串:char、varchar、text

timestamp: 是使用最多的数据类型->十位数的时间戳
text:一旦用到text类型的时候就可以考虑分表; 如果不分表的话,该字段的查询不会直接放在一起查询,因为多个字段查询中其中如果有text字段的话,就容易遇到慢查询 所以通常的话,如果需要这个值的时候会根据id单独拿这个text字段

8.流程控制语句其他语法

if 的语法格式为: 
if 条件表达式 then 语句 
	[elseif 条件表达式 then 语句] .... 
	[else 语句] 
	end if 
	
case 的语法格式 
首先是第一种写法:
case 表达式
	whenthen 语句
	whenthen 语句 
	... 
	[else 语句]
end case 

然后是第二种写法: 
case 
	when 表达式 then 语句 
	when 表达式 then 语句 
	.... 
	[else 语句] 
end case 

loop 循环 语法格式为:
[标号:] loop 
	循环语句 end loop [标号] 
	while 
	while a>100 do 循环语句 
	End while 

Repeat //游标
	SQL语句1 
	UNTIL 条件表达式 
END Repeat; 

Loop
	SQL语句 
	所有的条件判断和跳出需要自己实现 
End loop 

leave 语句用来从标注的流程构造中退出,它通常和 begin...end 或循环一起使用 leave 标号; 

声明语句结束符,可以自定义: 
DELIMITER [符合]
delimiter $$
$$

9.游标

也可以称为光标
在存储过程中用来对结果进行循环处理
步骤:声明、打开、取值、关闭。

9.1语法

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

9.2总结

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

9.3案例

delimiter $$ 
create procedure exchange(out count int ) 
begin 
	declare supply_id1 int default 0;
	declare amount1 int default 0; -- 游标标识 
	declare blag int default 1; -- 游标 
	declare order_cursor cursor for select supply_id,amount from order_group; 
	-- not found 这个异常进行处理 
	declare continue handler for not found set blag = 0; set count = 0; 
	-- 打开游标 
	open order_cursor; 
	-- 遍历 
	read_loop: LOOP 
		fetch order_cursor into supply_id1,amount1; 
		if blag = 0 then 
			leave read_loop; 
		end if; 
		if supply_id1 = 1 then 
			set count = count + amount1;
		end if; 
	end loop read_loop; 
end; 
$$
delimiter ;
call exchange(@count);
select @count;

10.存储过程优点

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

11.存储过程的缺点

  1. 第一个缺点就是移植性差。因为存储过程是和数据库绑定的,如 果我们要更换数据库之类的操作,可能很多地方需要改动。
  2. 第二个缺点就是修改不方便。因为对于存储过程而言,我们并不 能特别有效的调试,它的一些 bug 可能发现的更晚一些,增加了应 用的危险性。
  3. 第三个缺点就是优势不明显和赘余功能。对于小型 web 应用来说, 如果我们使用语句缓存,发现编译 SQL 的开销并不大,但是使用存 储过程却需要检查权限一类的开销,这些赘余功能也会在一定程度 上拖累性能。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!