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 表达式
when 值 then 语句
when 值 then 语句
...
[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总结
- 游标的声明的语法: declare 游标名称 cursor for 查询语句;
- 打开光标的语法: open 游标名称;
- 获取游标数据: fetch 游标名称 into 变量名 1 [,变量名 2 …]
- 关闭游标的语法: close 游标名称;
- 游标的基本使用须知:对某个表按照循环的处理,判断循环结束 的条件是捕获 not found 的条件,当 fetch 光标找不到下一条记录的 时候,就会关闭光标然后退出过程。
- 可能有过 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.存储过程优点
- 第一点优势就是执行速度快。因为我们的每个 SQL 语句都需要经 过编译,然后再运行,但是存储过程都是直接编译好了之后,直接 运行即可。
- 第二点优势就是减少网络流量。我们传输一个存储过程比我们传 输大量的 SQL 语句的开销要小得多。
- 第三点优势就是提高系统安全性。因为存储过程可以使用权限控 制,而且参数化的存储过程可以有效地防止 SQL 注入攻击。保证了 其安全性。
- 第四点优势就是耦合性降低。当我们的表结构发生了调整或变动 之后,我们可以修改相应的存储过程,我们的应用程序在一定程度 上需要改动的地方就较小了。
- 第五点优势就是重用性强。因为我们写好一个存储过程之后,再 次调用它只需要一个名称即可,也就是”一次编写,随处调用”,而且 使用存储过程也可以让程序的模块化加强。
11.存储过程的缺点
- 第一个缺点就是移植性差。因为存储过程是和数据库绑定的,如 果我们要更换数据库之类的操作,可能很多地方需要改动。
- 第二个缺点就是修改不方便。因为对于存储过程而言,我们并不 能特别有效的调试,它的一些 bug 可能发现的更晚一些,增加了应 用的危险性。
- 第三个缺点就是优势不明显和赘余功能。对于小型 web 应用来说, 如果我们使用语句缓存,发现编译 SQL 的开销并不大,但是使用存 储过程却需要检查权限一类的开销,这些赘余功能也会在一定程度 上拖累性能。
来源:CSDN
作者:行~者
链接:https://blog.csdn.net/zqy_CSDN_name/article/details/104691375