含义:一组预先编译好的SQL语句的集合,理解成批处理语句
作用:
① 提高代码的重用性
② 简化操作
③ 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
一、创建
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储过程体
end
注意:
① 参数模式:in、out、inout,其中in可以省略
② 如果存储过程体仅仅只有一句话,begin end可以省略
③ 存储过程体的每一条sql语句都需要用分号结尾
④ 存储过程的结尾可以使用 delimiter 重新设置
语法:
delimiter 结束标记
例:
delimiter $
--注意:这个是设置结尾,不要加分号!如果加了分号结尾将用$;结尾
--且设置了结尾为$了之后,以后的查询语句将用$结尾
二、调用
call 存储过程名(实参列表)
① 调用in模式的参数:call sp1(‘值’);
② 调用out模式的参数:set @name; call sp1(@name);select @name;
③ 调用inout模式的参数:set @name=值; call sp1(@name); select @name;
例1:插入到studenrt表中五条记录
CREATE PROCEDURE stone()
BEGIN
INSERT INTO student(stuname,`password`)
VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $
-- 调用
CALL stone()$
例2:创建带in模式参数的存储过程
创建存储过程实现 根据beauty表中的女生名字,查询boys表中对应的男朋友信息,其中boys表中的id与beauty表中的boyfriend_id相呼应。
CREATE PROCEDURE sttwo(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name=beautyName; --beautyName为传过来的参数
END $
--调用
CALL sttwo('lily')$
例3:创建out 模式参数的存储过程
根据beauty表输入的女生名,返回boys表中对应的男朋友名,其中boys表中的id与beauty表中的boyfriend_id相呼应。
REATE PROCEDURE stthree(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyname INTO boyname -- 查到的男生名字放进boyName,由boyName返回
FROM boys bo
RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
WHERE b.name=beautyName ;
END $
例4:创建带inout模式参数的存储过程
#案例1:传入a和b两个值,最终a和b都翻倍并返回
CREATE PROCEDURE stforth(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
--调用
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
SELECT @m,@n$
三、查看
show create procedure 存储过程名;
四、删除
drop procedure 存储过程名;
注意:只能一个一个的删除,不能一次性删除两个和或两个以上。
如:
DROP PROCEDURE stone;--√
DROP PROCEDURE sttwo,stthree;--×
五、函数与存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1 个返回,适合做处理数据后返回一个结果