1.定义:具有名字的一段SQL代码,用来完成一个特定的功能(输入、输出、逻辑关系)
2.优点:
- 存储过程可以封装,隐藏了复杂的逻辑
- 存储过程可以回传数据,并可以接受参数
- 先编译后运行,效率高
- 可以用在数据检验、前置实行业务逻辑
3.缺点:
- 定制化于特定的数据库,移植性不友好
- 存储过程调试比较困难
4.语法
delimiter $$
create procedure [if not exists] 存储过程名([参数列表])
begin
存储过程代码
end$$
delimiter ;
-- 调用存储过程
call 存储过程名([参数列表])
delimiter:重新定义存储过程的结束符号,MySQL的结束符默认是“;”。
存储过程名的命名规范:同数据库命名规范,推荐使用有实际意义的单词。
参数列表:三种参数类型(in、out、inout)
- in:允许使用该类型的参数向存储过程内部传入数据
- out:允许使用该类型的参数向存储过程外部传出数据
- inout:既可以传入数据也可以传出数据
5.用法
concat(str1,st2,str3,...):将str1,str2连接成一个字符串
concat_ws(sep,str1,st2,str3,...):使用分隔符sep将str1,str2连接成一个字符串
修改为 select concat_ws() into msg from....
定义变量
存储过程内部变量
declare 变量名 数据类型 [default 默认值];
declare要写在存储过程的其他语句的前面;使用declare定义的变量的时候,不需要使用@变量名模式,直接用。
用户变量
客户端使用的变量,也称为外部变量
set @变量名=值;
6.结构语句
6.1分支结构
6.1.1if语句
if 条件 then
执行代码
[else if 条件 then
执行代码
else
执行代码
]
end if;
6.1.2case语句
set @var=1;
case @var
when 1 then
执行代码;
when 2 then
执行代码;
else
执行代码;
end case;
6.2循环结构
[label:]while 条件表达式 do
语句块;
end while [label];
label:标签,用于标识循环的入口,如果中途需要跳出循环,就必然会用到这个标签。
[label:]repeat
语句块;
until 条件表达式 end repeat label;
关键字:
iterate迭代:重新开始执行循环语句;当执行到该关键字的时候,循环后面的语句就不执行了,而是从头再来
leave离开:直接离开循环,循环结束。
函数
一段用于实现一个独立功能的SQL代码,具有返回数据结果的能力。
create function 函数名([参数列表]) returns 返回类型
begin
语句块;
return 结果;
end
-- 调用方式
函数名([参数列表]) --直接调用
set @变量名=函数名([参数列表]) --将函数的返回结果赋值给变量
函数只能返回一个参数,要返回多个参数使用存储过程