存储过程:是一组为了完成特定功能的sql语句的集合,类似于函数
写好一个存储过程之后,我们可以像函数一样随时可以调用sql的集合
复杂的,需要很多sql语句联合执行完成的任务
存储过程在执行上比sql语句执行速度快,效率也更高
创建存储过程:
delimiter $$
将语句的结束符号从分号临时改变成两个$$
create procedure proc ()
创建存储过程。proc:存储过程的名字,在当前库中唯一。()中不定义任何方法
begin
过程体开始的关键字
select * from info;
begin后面跟上的是需要执行的sql语句
end $$
整个语句结束,和上面的定义看i是符号$$一一对应
delimiter;
将结束语句的分号恢复
delimiter的作用:保证整个存储过程中的sql语句能够被完整的执行
注释:
# :井号键
-- :--加空格
show procedure status where db='fmh';
show procedure status like '%proc%';
call proc;
drop PROCEDURE if EXISTS proc;
存储过程中,参数有三种运用的方式:
1、in 输入参数
调用者向存储过程传入值
delimiter $$
create PROCEDURE test1 (in uname char(20) )
BEGIN
select * from info where name = uname;
select * from info;
update info set name = '吴少' where name=uname;
end $$
delimiter;
call test1('吴少');
2、out 输出参数
表示存储过程向调用者传出值(可以返回多个值)
delimiter $$
create PROCEDURE test2 (out num int)
BEGIN
set num = 100;
end $$
delimiter;
call test2(@num);
insert into info values(2,'少爷',@num,'是');
3、inout
表示调用者向存储过程传入值,存储过程对传入值可能进行额外的操作之后,返回给调用者
delimiter $$
create PROCEDURE test3 (INOUT str varchar(10))
BEGIN
select str;
-- 显示输入的字符
set str = concat(str,'_abc');
-- 让传入的字符串做一个拼接
select str;
-- 加工之后的字符串
end $$
delimiter;
set @str='千金';
call test3(@str)
UPDATE info set name=@str where id = 1;
过程:
in:先传入,定义变量的值,初始值
call test3 调用存储过程,把变量的值传入存储过程
@str=千金_abc
存储过程中的控制语句:
delimiter $$
create PROCEDURE test5 (inout num int)
BEGIN
if num >= 10 THEN
set num=num-6;
ELSE
set num=num*2;
end if;
-- 结束if语句的判断
set num = num;
end $$
delimiter;
set @num=5;
call test5(@num)
update info set id = @num where score = 100;
调用多个参数: 范围的方式匹配,完成传参-----写入表中
delimiter $$
create PROCEDURE test7(inout score int,out grade varchar(15))
BEGIN
if score between 85 and 100 then
set grade = '优秀';
ELSEIF score between 60 and 84 then
SET grade = '一般';
ELSE
set grade = '不及格';
end if;
select grade;
end $$
delimiter;
set @score=95;
call test7(@score,@grade);
update info set score=@score,pass=@grade where id = 10;
while循环语句:
delimiter $$
create PROCEDURE test8 (out result int)
BEGIN
DECLARE a INT;
DECLARE i INT;
set a=10;
set i=1;
while i<=10 do
set a=a+10;
set i=i+1;
-- 相当于i++
end while;
set result =a;
end $$
delimiter;
set @result=110;
call test8(@result)
select @result
注意:
1、使用存储过程中,在内部变量不需要加@,外部使用和赋值要加@,引用变量
2、在存储过程begin之后声明变量:declare a INT; declare i INT; 声明变量要加数据类型
3、要想使用存储过程里面的结果,必须要out才能传出参数。在声明存储变量是,要定义好参数的传参方式(in out INOUT)