MYSQL 学习笔记之存储过程

115 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

什么是存储过程

存储过程是为了完成特定功能而编写的函数。它允许我们像使用函数一样,传入参数,获取返回值。

创建存储过程

MySQL 5.0之前的版本并不支持存储过程

  • Demo:
delimiter //
create procedure test(in name varchar(100) )
begin
	select * from tableName where user_name=name;
end //
delimiter ;
  • 说明:

delimiter(英文为分隔符的意思):与创建存储过程的语法无关,但是可以将原来的分隔符 ";"改为 "//",这样就可以以一个整体发送给服务器。最后的 delimiter 后的 ";"又将分隔符改为 "//"

delimiter 后面的分隔符要有空格,不然会报错

begin..end 中间为存储过程主体 create procedure 创建一个新的存储过程

test 存储过程名 in name varchar(100) 存储过程参数 语法:in/out/inout 参数名 参数类型

  • 参数说明

存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开

  • 输入参数:in

调用存储过程时必须指定,否则报错;

其值可以被读取,可以被改变,但是改变后的作用域仅限于函数内部。

  • 输出参数:out

一个小例子:返回特定人员的年龄

--创建存储过程 delimiter // create procedure myproc(in name varchar(100),out age int ) begin select age into age from ssmdemo.tb_user where user_name=name; end // delimiter ; --调用 call myproc('jj',@age); select @age;

age为表中的字段,传递的参数名不应该为age,换一个名词 注意:上述代码一直返回结果为空,所以注意,参数不能和表字段同名

输入输出参数:inout

调用时指定,并且可被改变和返回

可以被读取也可以被修改

注意:out 和 inout 的区别是,out 仅能被修改,不能被读取,比如 a=a+1,a 为 out 时,前面这个语句就会报错;而如果 a=a+1,a 为 inout 时,该语句就不会出错,因为 inout 可以被读取传入的值。

调用存储过程

call 存储过程名(参数)

删除存储过程

drop procedure 存储过程名;

存储过程中的控制语句

  • if..then..elseif..then..else ..end if;
delimiter //
create procedure mypro(in init int,out result varchar(200))
begin
if init=0 then
set result='是0啊';
elseif init=1 then
set result='是1啊';
else
set result='其他';
end if;
end //
delimiter ;
 
call mypro(2,@result);
select @result;
  • case 变量 when 条件 then 结果 else 结果 end case
delimiter //
create procedure mypro2(in name varchar(2),out result varchar(10))
begin
case name
when '王' then
set result='姓王';
when '李' then
set  result='姓李';
else 
set  result='其他';
end case;
end //
delimiter ;
 
call mypro2('王',@result);
select @result;
  • while 条件 do end while
delimiter //
create procedure mypro3(in init int,inout sum int)
begin
while init<=100 do
set sum=sum+init;
set init=init+1;
end while;
end //
delimiter ;
 
 
set @sum=0;
call mypro3(1,@sum);
select @sum;

结束语

本文如有错误,欢迎大家指正批评。