存储过程
含义:一组预先编译好的sql语句的集合,理解成批处理语句,类似于Java中的方法。
好处:
- 提高了代码的重用性
- 简化操作
- 减少了编译次数并且减少了和数据库服务器连接的次数,提高了效率
存储过程的创建
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的sql语句)
END
参数列表包含三个部分:参数模式 参数名 参数类型
举例:IN name varchar(20)
参数模式:
- IN:该参数可以作为输入,需要调用方传入值;
- OUT:该参数作为输出,可以作为返回值;
- INOUT:该参数既可以作为输入又可以作为输出,也就是急需要传入值,又可以返回值。
注意:
- 如果存储过程体 仅仅只有一条sql语句,BEGIN END可以省略;
- 存储过程体中的每条sql语句的结尾要求必须加分号;
- 存储过程的结尾可以使用DELIMITER重新设置,具体看案例。
存储过程的调用
CALL 存储过程名(实参列表);
- 空参列表
案例:
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username,password)
VALUES('john',000),('lili',111),('tom',222);
END $
#调用
CALL myp1() $
- 带有IN模式的参数的存储过程
案例:用户是否登录成功
DELIMITER $
CREATE PROCEDURE myp2(IN username VARCHAR(20),IN password VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0; #声明并初始化局部变量
SELECT COUNT(*) INTO result #变量复制
FROM admin
WHERE admin.username=username
AND admin.password=password;
SELECT IF(result>0,'登录成功','登录失败'); #使用变量
END $
#调用
CALL myp2('张飞','888') $;
- 带有OUT模式的参数的存储过程
案例:根据女神名,返回对应的男神名和男神魅力值
DELIMITER $
CREATE PROCEDURE myp3(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
SELECT bo.boyName,bo.userCP INTO boyName,userCP
FROM boys bo
INNER JOIN beauty b ON bo.id=b.boyfriend_id
WHERE b.name=beautyName;
END $
#调用
CALL myp3('小昭',@bname,@usercp) $
- 带有INOUT模式的参数的存储过程
案例:传入a和b两个值,最终a和b 都翻倍并返回
DELIMITER $
CREATE PROCEDURE myp4(INOUT a INT,INOUT b INT)
BEGIN
a=a*2;
b=b*2;
END $
#调用
SET @m=10
SET @n=30;
CALL myp4(@m,@n) $
SELECT @m,@n $
查看存储过程
SHOW CREATE PROCEDURE 过程名;
存储过程的删除
DROP PROCEDURE 过程名;
不支持同时删除多个过程名