存储过程
一组预先编译好的sql语句集合,理解成批处理语句
- 创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的SQL语句)
end;
说明:
- 参数列表包含三个部分:参数模式 参数名 参数类型
举例:IN stuname VARCHAR(20) - 参数模式:
IN:该参数可以作为输入,也就是需要调用方法传入值
OUT:该参数可作为输出,也就是可作为返回值
INOUT:该参数既可以做输出,也可以做输入 - 若存储体只有一句话,那么begin和end可以省略
- 存储过程体中的每条SQL语句必须添加分号。存储过程的结尾可以使用delimiter重新设置。原因在于
语法:DELIMITER 结束标记(如:$,!之类的标记) - 注意这些操作MySQL不支持,只能在命令提示符上写
- 调用语法
调用只是执行了存储过程内的语法,并不会得到输出,如果需要输出还要用select进行查看
call 存储过程名(实参列表);
空参的存储过程
例:往admin表中插入三行数据
#创建存储过程
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username ,`password`)
VALUES('john1','0000'),('lily','0001),('rose','0002');
END $
#调用存储过程,此时才会真正插入数据
CALL myp1()$
#查看数据
SELECT * FROM admin $
上述例子易看出,一旦设置了终止符,后面的命令都要用该符号结尾
带in模式的存储过程
- in模式不是没有输出,它的输出就是存储过程内部语法的执行结果,如果执行结果有输出,如select某些记录,则输出就是这些记录
例:创建存储过程实现 用户是否登陆成功(密码用户名是否匹配admin表中已有数据)
#创建存储过程
CREATE PROCEDURE myp2(IN username VARCHAR(20), IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result VARCHAR(20) DEFAULT ''; #声明初始化
SELECT COUNT(*) INTO result
FROM admin
WHERE admin.`username`=username
AND admin.`password`=PASSWORD;
SELECT IF(result>0,'成功','失败'); #使用
END $
#调用存储过程
CALL myp2('张飞','00998') $
- IN后面的就是局部变量
带OUT模式的存储过程
例:根据女生名(beauty表),返回对应男生名(boys表)
#创建存储过程
CREATE PROCEDURE myp4(IN beautyName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName
FROM boys bo
INNER JOIN beauty b ON bo.id=b.boyfriend_id
WHERE b.name=beautyName;
END $
#调用时,OUT的变量不需要赋值
CALL myp4('王语嫣',@bName)$ #调用存储过程,@bName是一个用户变量
SELECT @bName $ #查询对应男生名字
- 注意最后会自动输出OUT,要记得把查出来的值赋值给输出,即select…into…
创建带INOUT模式的存储过程
例:传入a, b两个值,最终a,b均翻倍并返回
#创建存储过程
CREATE PROCEDURE myp5(INOUT a INT, INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2; #局部变量
END $
#创建用户变量并初始化赋值
SET @m=10$
SET @n=20$
#调用存储过程
CALL myp5(@m,@n)$
#查看最终结果
SELECT @m,@n$
删除存储过程
- 一次只能删除一个
- 语法:drop procedure 存储过程名;
查看存储过程的信息
- 语法:show create procedure 存储过程名;
- 不可以修改存储过程的语句,只能删除重建