一、书面化解释
本质上就是将sql语句封装成一个方法,这个方法在sql中称为存储过程,可以把固定常用的东西放入存储过程中,但他是单独的执行单元,可以直接调用完成复杂的操作
设置临时结束符(常用于存储过程和自定义函数使用,通常修改后的结束符用在end后)
delimiter $$; -- 此处把结束符临时改为$$ 防止因为;而结束了函数
.... -- sql语句
delimiter ; -- 将临时结束符改回;
凡是有两个end的 第一个end一定是 end +执行语句头
二、存储创建和使用及删除
创建存储过程**
create procedure 存储过程名()
begin
-- sql语句
end;
启动存储过程
call 存储过程名;
删除
drop procedure 存储过程名;
三、存储过程带参形式创建
create procedure 存储过程名(int|out|inout 形参名 字段类型,....)
begin
sql语句 -- 可以在这引用传递进来的值
end;
- in : 传入参数 -> 不指定则默认in
- out:传出参数 -> 最后会返回的参数
- inout:可以传入可以传出 -> 即既需要传入也需要传出的形参,比如传入id,返回id
in 例子
create procedure lookName(in uid int) -- 指定uid为传传入参数
begin
select username from user where id = uid; -- 使用id = uid 来动态调用存储过程
end;
out例子
create procedure getName(in uid int ,out name varchar(10)) -- 创建一个out类型的参数
begin
select user.username into name from user where id = uid; -- 使用into赋值再from查表
end;
set @name=''; -- 创建用户变量,详细看总
call getName(5,@name); -- 调用过程来给@name赋值
select @name; -- 查询值,为过程查询出来的值
inout例子 -> 注意:是给需要返回和调用的参数使用
create procedure getNamePlus(inout uid int, out name varchar(10)) -- 创建存储过程
begin
select id , username into uid , name from user where id = uid;--复制顺序和查询顺序一致
end;
set @id = 3; -- 创建用户变量
set @name = '';
call getNamePlus(@id,@name); -- 调用过程,结果返回id = 3 , name 为查出的name
select concat('id为',@id,'的名字是',@name); -- 展示参数
注意:select id , username into uid , name from user where id = uid;
into的前后的顺序为赋值的顺序,对应的
四、存储过程的条件
1.单分支结构 if _ then _ else _ end if,演示为id为积数就输出id,反之输出id+名字
delimiter $$ -- 修改临时结束符
create procedure ifJi(in uid int)
begin
declare name varchar(10) default ''; -- 创建临时变量,便于输出
if(uid % 2 = 0) -- 判断
then -- 为真的语句块
select id,username into uid , name from user where id = uid;
select concat('id为',uid,'的名字为',name);
else select uid; -- 为假的语句块
end if; -- 结束语句
end$$
delimiter ;
call ifJi(6); -- 调用过程
分为以下几个步骤
- if 判断条件
- then 为真时的代码块
- else 为假时的代码块
- end if 结束语句
*2.多分支结构 if_then_elseif_else_end if ,演示:number为1输出1 为2输出2 都假就输出不为1也不为2
create procedure ifNumber(in number int)
begin
if(number = 1)
then select concat('number为1');
elseif(number = 2) -- 注意是elseif 不是else if
then select concat('number为2');
else select concat('number 不为1 不为2');
end if; -- end if中end和if是分开的
end;
call ifNumber(5);
3.指定值判断,case_when_then_end case(注意是end case 和判断函数区分,判断函数是end),演示:通过查询出来的值特判内容
create procedure sexValue(inout sid int)
begin
declare sexNumber int default 2;
select id,sex into sid,sexNumber from stu where id = sid; -- 为演示,直接查sex值
case sexNumber
when 1 then select concat('id为',sid,'的性别为','男');
when 0 then select concat('id为',sid,'的性别为','女');
else select concat('id为',sid,'的性别为','保密');
end case; -- 注意区分和判断函数的区别 判断函数是end 而 过程中的case是以end case结尾(因为有多个end,所以需要区分)
end;
set @sid = 3;
call sexValue(@sid); -- 启动过程
五、循环语句
1.while循环 语句顺序是 while_do_end while (像java的for), 演示:循环添加数据 -
create procedure moreOfterInsert()
begin
declare sid int default 1; -- 创建变量
while(sid <= 50) -- 条件
do insert into stu(name,sex) values(concat('李四',sid),1); -- 注意do
set sid = sid +1; -- 改值
end while; -- 注意do while
end;
call moreOfterInsert();
2.repeat循环 语句顺序是 repeat_until_end repeat (像java的while(true)) 演示:循环添加数据
create procedure repeat_insert()
begin
declare sid int default 50;
repeat -- 开启repete
insert into stu(name , sex) values('小红',0);
set sid = sid + 1;
until sid > 100 -- 终止条件
end repeat; -- 结束
end;
call repeat_insert();